2015-08-23 168 views
3

雖然我已經檢查了很多次,但我無法理解爲什麼會出現這種情況,但我僅通過字符串進行搜索時,出現以下錯誤:我已經檢查到在填充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; 
     } 
    } 
} 

調試器;

enter image description here

解決:

到底是人類的愚蠢和careleness而導致這整個的難題,我謝謝大家誰幫我得出正確的結論。

+0

'nchar(20)'不是你想要的,但不會導致錯誤。 「SPP」的定義在哪裏?它創建的參數的數據類型是什麼? –

+0

@MartinSmith SPP是存儲過程參數,它的屬性是名稱和值,因此爲什麼loc_nombre,name是傳遞下來的。我將在我的文章中添加高級存儲過程代碼。 –

+0

Locales表的loc_nombre的類型是什麼? – ssakash

回答

0

版本控制存在與數據庫重複的問題,我使用的是過時的版本控制。