我有这段代码
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 :(得分:4)
永远不要连接字符串以形成SQL查询,始终使用参数化查询。对于您的代码,您可以使用SqlParameter
和您的命令。而不是将DateTime
转换为字符串,然后在DateTime
查询中将其转换回INSERT
,只需在参数中添加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();
}
如果datecreation
来自DateTime
对象,则直接添加,否则您可以将其解析为DateTime
对象,让SQL服务器为您处理剩下的事情。
答案 1 :(得分: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();
}
答案 2 :(得分:0)
问题是,您的服务器可能具有与您的计算机不同的语言设置。 要确保转换正在使用Convert函数。完整的教程在这里:http://www.sqlusa.com/bestpractices/datetimeconversion/
BTW构造查询如连接字符串是非常危险的方式。而不是这个使用SqlParamerts。此外,使用此方法的优点是.NET将为您进行转换。
答案 3 :(得分: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);
答案 4 :(得分:0)
首先,它真的是一个糟糕的查询而且非常hacky,你不应该像这样编写查询
string sql = "insert into Usertable ";
sql += "values(" + mVendid + ", '" + usrname + "','" + usrpass + "', cast('" +
datecreation + "'as DATETIME),'" + createdby + "')";
* 始终使用Paramaterised Queries *
可能存在错误,因为您正在将某些文本转换为日期时间。可能的原因日期时间不完善 Dateimte与您的服务器日期时间不匹配 尝试打印出其创建的确切值
cast('" +
datecreation + "'as DATETIME)