我遇到了以下错误,虽然我已经检查了很多次,但我无法理解为什么在我只搜索一个字符串时会出现这样的错误,我已经检查过,在填充下面的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;
}
}
}
调试器;
已解决:
最终是人类的愚蠢和粗心导致了整个难题,感谢所有帮助我得出正确结论的人。
nchar(20)
不是你想要的,但不会导致错误。SPP
的定义在哪里?它创建的参数的数据类型是什么? - Martin Smith