C# &引用;超出范围值“;将varchar转换为datetime时出错

C# &引用;超出范围值“;将varchar转换为datetime时出错,c#,sql-server-2008,datetime,data-conversion,C#,Sql Server 2008,Datetime,Data Conversion,我有这个密码 datecreation = todaydate.Substring(6, 4) + todaydate.Substring(3, 2) + todaydate.Substring(0, 2) string sql = "insert into Usertable "; sql += "values(" + mVendid + ", '" + usrname + "','" + usrpass + "', cast('" + datec

我有这个密码

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 server管理中,它工作正常

究竟是什么,它在网络上不起作用

错误是将varchar数据类型转换为datetime数据 类型导致值超出范围。声明已被修改 终止


检查服务器的时区。可能与您的本地计算机所在的时区不同。您可以通过使用参数来避免该问题

    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();
}

检查服务器的时区。可能与您的本地计算机所在的时区不同。您可以通过使用参数来避免该问题

    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();
}

永远不要连接字符串以形成SQL查询,始终使用参数化查询。对于您可以使用的代码,使用您的命令。在这里,不必将
DateTime
转换为字符串,然后在
INSERT
query中将其转换回
DateTime
,只需在参数中添加
DateTime
对象的值即可。这不仅可以让你免于痛苦,还可以解决像你现在这样的问题

比如:

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

不要连接字符串以形成SQL查询,始终使用参数化查询。对于您可以使用的代码,使用您的命令。在这里,不必将
DateTime
转换为字符串,然后在
INSERT
query中将其转换回
DateTime
,只需在参数中添加
DateTime
对象的值即可。这不仅可以让你免于痛苦,还可以解决像你现在这样的问题

比如:

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

问题在于,您的服务器可能与您的计算机具有不同的语言设置。 要确保转换工作正常,请使用Convert函数。完整教程如下:


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

问题在于,您的服务器可能与您的计算机具有不同的语言设置。 要确保转换工作正常,请使用Convert函数。完整教程如下:


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

首先是用户参数(更好、更清晰、更安全!)。其次,由于格式问题,会发生此错误

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);

首先是用户参数(更好、更清晰、更安全!)。其次,由于格式问题,会发生此错误

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);

首先,这是一个非常糟糕的查询,而且非常粗糙,您不应该这样编写查询

string sql = "insert into Usertable ";
sql += "values(" + mVendid + ", '" + usrname + "','" + usrpass + "', cast('" + 
datecreation + "'as DATETIME),'" + createdby + "')";
*始终使用参数化查询*

可能存在错误,因为您正在将某些文本转换为日期时间。可能的原因日期时间不完整 Dateimte与您的服务器datetime不匹配 试着打印出它所创造的确切价值

 cast('" + 
    datecreation + "'as DATETIME)

首先,这是一个非常糟糕的查询,而且非常粗糙,您不应该这样编写查询

string sql = "insert into Usertable ";
sql += "values(" + mVendid + ", '" + usrname + "','" + usrpass + "', cast('" + 
datecreation + "'as DATETIME),'" + createdby + "')";
*始终使用参数化查询*

可能存在错误,因为您正在将某些文本转换为日期时间。可能的原因日期时间不完整 Dateimte与您的服务器datetime不匹配 试着打印出它所创造的确切价值

 cast('" + 
    datecreation + "'as DATETIME)