2013-06-02 40 views
0

我的數據庫中有一個存儲過程,其中DateTime作爲參數。就我而言,如果我發送一個datetime對象,框架會做魔術(lol)。將日期時間發送到C#中的SQL查詢

然而,當我運行查詢我出現以下錯誤消息的異常:

錯誤的數據類型爲nvarchar轉換爲datetime。

我做了一個通用的方法與數據庫中,我只告訴他的存儲過程的名稱和參數進行通信。我從C#發送的datetime是從配置文件中讀取並轉換的。

任何想法?

編輯

我使用C#與.NET Framework和使用SQL Server 2008數據庫。

我從配置文件中的日期是這樣的:

DateTime fechaSistema = Convert.ToDateTime(ConfigurationSettings.AppSettings["fechaSistema"]); 

在配置文件:

<appSettings> 
    <add key ="fechaSistema" value = "2013-05-28"/> 
    </appSettings> 

執行的程序代碼如下所示:

 private static DataTable _retrieveDataTable(string procedure, List<string> args, params object[] values) 
    { 
     SqlConnection cn = new SqlConnection(); 
     SqlCommand cm = new SqlCommand(); 
     SqlDataReader dr; 
     DataTable dt = new DataTable(); 

     try 
     { 
      conexionSql(cn, cm); 
      cm.CommandType = CommandType.StoredProcedure; 
      cm.CommandText = "HARDCODERS."+procedure; 
      _loadSqlCommand(args, values, cm); 
      dr = cm.ExecuteReader(); 
      dt.Load(dr); 
      return dt; 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 

     finally 
     { 
      if (cn != null) 
      { 
       cn.Close(); 
      } 
     } 
    } 
private static void _loadSqlCommand(List<string> args, object[] values, SqlCommand cm) 
{ 
    for (int i = 0; i < args.Count; i++) 
    { 
     cm.Parameters.AddWithValue(args[i], values[i].ToString()); 
    } 
} 

而這種調用方法的確如此:

SqlConnector.retrieveDataTable("getTop5ClientesConMasPuntosAcumulados", Globals.getFechaSistema()); 
+5

c#代碼將是相關的。 –

+1

***什麼***數據庫(及其版本)? –

+3

我打算出去,並且猜測你正在嘗試爲參數傳遞nvarchar。 – LittleBobbyTables

回答

3

您的問題是在這條線:

private static void _loadSqlCommand(List<string> args, object[] values, SqlCommand cm) 
{ 
    for (int i = 0; i < args.Count; i++) 
    { 
     // This line: 
     cm.Parameters.AddWithValue(args[i], values[i].ToString()); 
    } 
} 

.ToString()調用.NET的力量,告訴的SQL Server,你要發送的參數是String類型,SQL無法將字符串轉換(nvarchar)直接到datetime。如果您刪除.ToString()呼叫,它應該按預期工作。

private static void _loadSqlCommand(List<string> args, object[] values, SqlCommand cm) 
{ 
    for (int i = 0; i < args.Count; i++) 
    { 
     // This should work: 
     cm.Parameters.AddWithValue(args[i], values[i]); 
    } 
} 
+0

哦,我是如此愚蠢的笑。但是如果我發送一個整數,它會自動解析它嗎? –

+0

Quéva,no te preocupes。 ;) – Meryovi

+0

是的,它應該總是發送適當的SqlDbType。 – Meryovi