我試圖從C#.NET 2.0調用存儲過程(在SQL 2005服務器上),使用DateTime
作爲SqlParameter
的值。存儲過程中的SQL類型是'datetime'。在SqlParameter中爲存儲過程使用DateTime,格式錯誤
從SQL Management Studio執行sproc可以正常工作。但每次我從C#中調用它時,都會收到有關日期格式的錯誤。
當我運行SQL事件探查器來查看調用時,然後複製粘貼exec
調用以查看發生了什麼。這是什麼,我已經嘗試我的觀察和注意事項:
1)如果我直接通過DateTime
爲DateTime
或轉換爲SqlDateTime
,本場是由單引號的一對周邊,如
@Date_Of_Birth=N''1/8/2009 8:06:17 PM''
2)如果我作爲一個字符串傳遞DateTime
,我只得到單引號
3)使用SqlDateTime.ToSqlString()
不會導致UTC格式的時間字符串(即使轉換爲通用時間後)
4)使用DateTime.ToString()
不會導致UTC格式的日期時間字符串。
5)手動設置的DbType
爲DateTime
不會改變上述觀察結果。
那麼,我的問題是,我是如何讓C#在SqlParameter
中通過正確格式化的時間?當然這是一個常見的用例,爲什麼工作很難?我似乎無法DateTime
轉換爲字符串,它是SQL compatable(如 '2009-01-08T08:22:45')
編輯
RE:貝麗,代碼實際執行存儲過程如下:
using (SqlCommand sprocCommand = new SqlCommand(sprocName))
{
sprocCommand.Connection = transaction.Connection;
sprocCommand.Transaction = transaction;
sprocCommand.CommandType = System.Data.CommandType.StoredProcedure;
sprocCommand.Parameters.AddRange(parameters.ToArray());
sprocCommand.ExecuteNonQuery();
}
要進入更詳細的關於什麼我曾嘗試:
parameters.Add(new SqlParameter("@Date_Of_Birth", DOB));
parameters.Add(new SqlParameter("@Date_Of_Birth", DOB.ToUniversalTime()));
parameters.Add(new SqlParameter("@Date_Of_Birth",
DOB.ToUniversalTime().ToString()));
SqlParameter param = new SqlParameter("@Date_Of_Birth",
System.Data.SqlDbType.DateTime);
param.Value = DOB.ToUniversalTime();
parameters.Add(param);
SqlParameter param = new SqlParameter("@Date_Of_Birth",
SqlDbType.DateTime);
param.Value = new SqlDateTime(DOB.ToUniversalTime());
parameters.Add(param);
parameters.Add(new SqlParameter("@Date_Of_Birth",
new SqlDateTime(DOB.ToUniversalTime()).ToSqlString()));
額外編輯
我認爲最有可能的工作之一:在這個價值
SqlParameter param = new SqlParameter("@Date_Of_Birth",
System.Data.SqlDbType.DateTime);
param.Value = DOB;
結果在exec調用所看到的SQL事件探查器
@Date_Of_Birth=''2009-01-08 15:08:21:813''
如果我修改這是:
@Date_Of_Birth='2009-01-08T15:08:21'
它的工作,但它不會解析與一對唱歌le引號,並且它不會在日期和時間之間正確地轉換爲DateTime
,並且在最後以毫秒爲單位。
更新和成功
我複製/從下面的請求後粘貼上面的代碼。我在這裏和那裏修剪了一些簡潔的東西。結果發現我的問題出在我遺漏的代碼中,我相信你們中的任何一個人都會馬上發現。我在一個交易中包裝了我的存儲過程調用。原來,我根本沒在做transaction.Commit()
!!!!!我很慚愧地說,但你知道。
我仍然不知道我從分析器返回的語法是怎麼回事。一位同事用他自己的計算機上的分析器實例觀察,並返回了正確的語法。從我的分析器中看到非常類似的執行情況,顯示了不正確的語法。它充當了一個紅鯡魚,使我相信有一個查詢語法問題,而不是更簡單和真實的答案,這就是我需要提交交易!
我在下面標記了一個正確答案,並在其他人中投了贊成票,因爲他們畢竟回答了問題,即使他們沒有解決我的具體問題(大腦失效問題)。
不似乎工作 - 每個SQL事件探查器,字符串格式是不正確的,如果我複製粘貼,每邊一對單引號是不要麼有效 – Matt 2009-01-08 21:45:48