雖然我已經檢查了很多次,但我無法理解爲什麼會出現這種情況,但我僅通過字符串進行搜索時,出現以下錯誤:我已經檢查到在填充Local對象時以下屬性是正確的。在gestor異常無法將nvarchar轉換爲int
[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());
}
}
方法:
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
例外:
Test Name: TestSearchLocalNombre
Test FullName: UT.UnitTestLocales.TestSearchLocalNombre
Test Outcome: Failed
Test Duration: 0:00:00.0568857
Result Message:Assert.Fail failed. System.Exception: Error: SQL Error: Error converting data type nvarchar to int.
at 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;
}
}
}
調試器;
解決:
到底是人類的愚蠢和careleness而導致這整個的難題,我謝謝大家誰幫我得出正確的結論。
'nchar(20)'不是你想要的,但不會導致錯誤。 「SPP」的定義在哪裏?它創建的參數的數據類型是什麼? –
@MartinSmith SPP是存儲過程參數,它的屬性是名稱和值,因此爲什麼loc_nombre,name是傳遞下來的。我將在我的文章中添加高級存儲過程代碼。 –
Locales表的loc_nombre的類型是什麼? – ssakash