异常无法将nvarchar转换为int

时间:2015-08-23 18:47:09

标签: c# sql-server

我收到以下错误,即使我已经多次检查我无法理解为什么当我只通过字符串搜索时会弹出这样的东西,我已经检查过,当填充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
  测试FullName: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

解决:

最后是人类的愚蠢和羞怯导致了这整个难题,我感谢所有帮助我做出正确结论的人。

1 个答案:

答案 0 :(得分:0)

版本控制存在重复数据库的问题,我正在使用过时的版本。