异常:无法将nvarchar转换为int

3

我遇到了以下错误,虽然我已经检查了很多次,但我无法理解为什么在我只搜索一个字符串时会出现这样的错误,我已经检查过,在填充下面的Local对象时属性是正确的。

[TestMethod]
public void TestSearchLocalName()
{
        try
        {

            IEnumerable lstLocales = gestor.searchLocal("Local1");
            Assert.IsNotNull(lstLocales);
            Console.Write("Se ha conseguido una lista de locales.");


        }
        catch (Exception ex)
        {
            Assert.Fail(ex.ToString());
        }
}

在Gestor中的方法:

public IEnumerable<Local> searchLocal(String name)
{
        try
        {
            return LocalRepository.Instance.getByName(name);
        }
        catch (DataAccessException ex)
        {
            throw ex;
        }
        catch (Exception ex)
        {
            throw new Exception(String.Format("Error: {0}", ex.Message));
        }
}

代码库:

public IEnumerable<Local> getByName(String name) {
        List<Local> lista = new List<Local>();

        try
        {
            DataTable tablaResultado = DataBaseAccess.advanceStoredProcedureRequest("pa_local_buscar_nombre", new SPP[] { 
            new SPP("loc_nombre", name.ToString())
            });

            if (tablaResultado.Rows.Count > 0)
            {

                foreach (DataRow fila in tablaResultado.Rows)
                {
                    lista.Add(new Local(

                        int.Parse(fila.ItemArray[0].ToString()),
                        fila.ItemArray[1].ToString(),
                        fila.ItemArray[2].ToString(),
                        fila.ItemArray[3].ToString(),
                        fila.ItemArray[4].ToString(),
                        int.Parse(fila.ItemArray[5].ToString()),
                        int.Parse(fila.ItemArray[6].ToString())
                    ));
                }
            }
            else
            {
                lista.Add(new Local());
            }
        }
        catch (Exception ex)
        {
            throw new Exception(String.Format("SQL Error: {0}", ex.Message));
        }

        return lista;
}

当我在单元测试中使用相同名称直接测试存储过程时,存储过程确实起作用,这让我相信错误不在此处,但为了以防万一:

CREATE PROCEDURE [dbo].[pa_local_buscar_nombre]
    @loc_nombre as nchar(20)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        loc_id, loc_nombre, loc_url,  loc_telefono, 
        loc_descripcion, loc_preferencia, loc_provincia  
    FROM 
        Locales
    WHERE  
        loc_nombre LIKE '%' + @loc_nombre + '%'
END

异常:

测试名称:TestSearchLocalNombre
测试全名:UT.UnitTestLocales.TestSearchLocalNombre
测试结果:失败
测试持续时间:0:00:00.0568857
结果消息:

Assert.Fail失败。System.Exception:错误:SQL错误:将nvarchar数据类型转换为int。
在BLL.GestorLocales.searchLocal(String name)中

编辑:

高级存储过程:

public static DataTable advanceStoredProcedureRequest(String name, SPP[] parameters = null)
{
        String storedProcedure = "dbo." + name;

        SqlCommand cmd = new SqlCommand(name, getConection);
        cmd.CommandType = CommandType.StoredProcedure;

        if (parameters != null && parameters.Length > 0)
        {
            foreach (SPP p in parameters)
            {
                cmd.Parameters.AddWithValue("@" + p.Name, p.Value);
            }
        }

        DataTable table = new DataTable();

        SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
        dataAdapter.Fill(table);

        return table;
}

EDIT2:

SSP:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAL
{
    public class SPP
    {

        public String Name { get; set; }
        public String Value { get; set; }

        /**
         * Stored Procedure Parameter
         */
        public SPP(String name, String value)
        {
            this.Name = name;
            this.Value = value;
        }
    }
}

调试器;

enter image description here

已解决:

最终是人类的愚蠢和粗心导致了整个难题,感谢所有帮助我得出正确结论的人。


nchar(20) 不是你想要的,但不会导致错误。 SPP 的定义在哪里?它创建的参数的数据类型是什么? - Martin Smith
1
你确定你连接的是你认为的数据库和实例吗?不是存储过程期望一个整数参数的不同实例吗? - Martin Smith
1
使用 SQL Profiler 捕获查询并重新运行。 - codingbiz
1
我们能否停止使用AddWithValue了? - Felix Pamittan
1
如果您自己找到了问题的解决方案,应该将其发布为答案并接受自己的答案,或者删除问题。 - Zohar Peled
显示剩余18条评论
1个回答

0

版本控制出了问题,数据库被复制了,我使用的是过时的数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接