0

我有这个代码

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 数据类型到 datetime 数据类型的转换导致值超出范围。该语句已终止。

4

5 回答 5

4

切勿连接字符串以形成 SQL 查询,始终使用参数化查询。对于您的代码,您可以使用SqlParameter, 与您的命令。无需转换DateTime为字符串,然后将其转换回query ,只需在参数中添加对象的值DateTime即可。这不仅可以让您免于Sql Injection,还可以解决您遇到的问题。INSERTDateTime

就像是:

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 Server 为您处理其余部分。

于 2013-05-20T09:25:14.533 回答
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);
于 2013-05-20T09:26:35.857 回答
0

首先,它确实是一个糟糕的查询,而且很hacky,你不应该写这样的查询

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

*始终使用参数化查询 *

可能存在错误,因为您正在将某些文本转换为日期时间。可能的原因 Datetime 格式不正确 Dateimte 与您的服务器 datetime 不匹配 尝试打印出其创建的确切值

 cast('" + 
    datecreation + "'as DATETIME)
于 2013-05-20T09:27:21.700 回答
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();
}
于 2013-05-20T09:24:30.440 回答
0

问题是您的服务器可能与您的机器具有不同的语言设置。为确保转换工作正常,请使用 Convert 函数。完整教程在这里:http ://www.sqlusa.com/bestpractices/datetimeconversion/

顺便说一句,构建像连接字符串这样的查询是非常危险的方式。而不是这个使用 SqlParamerts。此外,使用这种方法的优点是 .NET 将为您进行转换。

于 2013-05-20T09:25:38.253 回答