2013-05-20 66 views
0

,當我有這樣的代碼「超出範圍值」的錯誤一個varchar轉換爲datetime

datecreation = todaydate.Substring(6, 4) + todaydate.Substring(3, 2) + 
        todaydate.Substring(0, 2) 

string sql = "insert into Usertable "; 
sql += "values(" + mVendid + ", '" + usrname + "','" + usrpass + "', cast('" + 
datecreation + "'as DATETIME),'" + createdby + "')"; 

的問題是,只要它是在服務器這是給錯誤運行。在本地主機或SQL服務器管理中,它工作正常。

到底是什麼它不工作時,它是在網絡

的錯誤是一個varchar數據類型爲日期時間數據類型 導致超出範圍的值轉換。該聲明已被終止 。

回答

0

檢查服務器的時區。可能它與您的本地計算機是不同的時區。您可以通過使用參數來避免該問題。

string sql = @" 
INSERT INTO Usertable 
VALUES (@Parameter1, @Parameter2, @Parameter3, @Parameter4, @Parameter5)"; 

(using SqlCommand command = new SqlCommand(sql, myConnection)) 
{ 
    command.Parameters.AddWithValue("@Parameter1", mVendid); 
    command.Parameters.AddWithValue("@Parameter2", usrname); 
    command.Parameters.AddWithValue("@Parameter3", usrpass); 
    command.Parameters.AddWithValue("@Parameter4", todaydate); 
    command.Parameters.AddWithValue("@Parameter5", createdBy); 
    command.ExecuteNonQuery(); 
} 
4

永不連接字符串以形成SQL查詢,始終使用參數化查詢。對於您的代碼,您可以使用SqlParameter和您的命令。在那裏不是將DateTime轉換爲字符串,然後將其轉換回DateTimeINSERT查詢,只需在參數中添加DateTime對象的值即可。這不僅會節省你Sql Injection但也解決像您所遇到的一個問題。

喜歡的東西:

using(SqlConnection conn = new SqlConnection("Connectionstring")) 
using (SqlCommand cmd = new SqlCommand()) 
{ 
    string sql = "insert into Usertable "; 
    sql += "values(@mVendid, @usrname, @usrpass, @datecreation, @createdby)"; 
    cmd.CommandText = sql; 
    cmd.Parameters.AddWithValue("@mVendid", mVendid); 
    cmd.Parameters.AddWithValue("@usrname", username); 
    cmd.Parameters.AddWithValue("@usrpass", userpass); 
    cmd.Parameters.AddWithValue("@datecreation", Convert.ToDateTime(datecreation)); 
    cmd.Parameters.AddWithValue("@createdby", createdby); 
    cmd.Connection = conn; 
    conn.Open(); 
    cmd.ExecuteNonQuery(); 
} 

如果datecreationDateTime物體發出然後添加直接,否則你可以將其解析到DateTime對象,並讓SQL服務器處理剩下的給你。

0

的問題是,可能是你的服務器有不同的語言設置您的機器。 要確保轉換正在工作,請轉換函數。完整的教程在這裏:http://www.sqlusa.com/bestpractices/datetimeconversion/

順便說一句,像連接字符串構造查詢是非常危險的方式。而不是使用SqlParamerts。此外,使用這種方法的優點是,.NET將爲您做轉換。

0

所有用戶參數的第一個(更好,更清晰,更安全!)。其次,由於格式問題,此錯誤發生。

datecreation = todaydate.Substring(6, 4) + todaydate.Substring(3, 2) + 
       todaydate.Substring(0, 2) 

string date = DateTime.Parse(datecreation); 

string sql = "insert into Usertable values(@mvendid, @username, @usrpass, @date, @createdby)"; 

var con = new SqlConnection(""); // your connection string 
var cmd = new SqlCommand(sql, con); 

cmd.Parameters.AddWithValue("@mvendid", mVendid); 
... 
cmd.Parameters.AddWithValue("@date", date); 
0

首先它的一切真的不好的查詢和相當哈克,你不應該寫這樣的查詢

string sql = "insert into Usertable "; 
sql += "values(" + mVendid + ", '" + usrname + "','" + usrpass + "', cast('" + 
datecreation + "'as DATETIME),'" + createdby + "')"; 

* 始終使用Paramaterised查詢*

錯誤可能因爲你正在將一些文本轉換爲日期時間。可能的原因DATETIME沒有很好地形成 Dateimte不會到你的服務器的日期時間 嘗試匹配打印出它是什麼創造

cast('" + 
    datecreation + "'as DATETIME) 
精確值
相關問題