C# 错误:将varchar数据类型转换为smalldatetime数据类型导致值超出范围
我试图从C#向SQL Server表中插入数据,这是一个C# 错误:将varchar数据类型转换为smalldatetime数据类型导致值超出范围,c#,sql-server,C#,Sql Server,我试图从C#向SQL Server表中插入数据,这是一个smalldatetime值。在表中,我可以看到2013-10-24 00:00:00格式的数据 在我的代码中,在插入数据之前,我执行以下操作来检查dataTable中可用的数据是否为正确的datetime格式。在Excel中,包含字符串(日期值)的行可以是我在formats数组中输入的任何格式。在Excel中,数据以字符串形式显示 DateTime date; bool isValidBookedDate = true; string[
smalldatetime
值。在表中,我可以看到2013-10-24 00:00:00格式的数据
在我的代码中,在插入数据之前,我执行以下操作来检查dataTable中可用的数据是否为正确的datetime格式。在Excel中,包含字符串(日期值)的行可以是我在formats数组中输入的任何格式。在Excel中,数据以字符串形式显示
DateTime date;
bool isValidBookedDate = true;
string[] formats = { "yyyyddMM", "dd/MM/yyyy", "dd/mm/yyyy","yyyyddmm" ,
"dd-MMM-yy", "yyyyMMdd", "dd-mmm-yy", "yyyymmdd" ,
"dd/MM/yyyy hh:mm:ss", "yyyy-MM-dd" };
foreach (DataRow dtrow in excelDataSet.Tables[0].Rows)
{
if (DateTime.TryParseExact(dtrow[5].ToString().Trim(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None,out date))
{
isValidBookedDate = true;
}
else
{
isValidBookedDate = false;
break;
}
}
if(isValidBookedDate)
{
// SQL Server insert
}
在SQL ServerInsert into
语句中传递数据时,我收到一个错误
将varchar数据类型转换为smalldatetime数据类型导致值超出范围
如何解决这个问题?谢谢
更新代码1:
string[] formats = { "dd/MM/yyyy hh:mm:ss" };
if (DateTime.TryParseExact(row[5].ToString(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
row[5] = Convert.ToDateTime(date.ToString("{MM/dd/yyyy hh:mm:ss}")); // this line did not work
}
让我们有一个名为criteria的表,其中包含以下字段: id、名称、等级、说明、已删除、已插入、已注册用户、已更新、已更新用户、已使用) 更多工作,但更好地使用参数查询。这里我使用OLEDB
string[] ParamName = new string[1]; // can be more then one
object[] ParamValue = new object[1];
ParamName[0] = "Inserted" ;
ParamValue[0] = insertDate ; // will insert you date into inserted - simple format yyyyMMdd
ParamName[1] = "updated" ;
ParamValue[1] = DateTime.Now.ToString("yyyy-MM-ddThh:mm:ss"); // will insert current date into updated as complete date
strSQL = "insert into criteria values( 16777213, 'New name',1,'New name description',0,?,1,?,0,1)";
string res = InsertSQL(strSQL, ParamName, ParamValue);
public string InsertSQL(string strSql, string[] ParamName, Object[] ParamValue)
{
try
{
OleDbCommand cmd = new OleDbCommand(strSql, sqlConn);
for (int i = 0; i < ParamName.Length; i++)
{
if (ParamName[i] != "")
{
cmd.Parameters.AddWithValue(ParamName[i], ParamValue[i]);
}
}
cmd.ExecuteNonQuery();
return "OK";
}
catch (Exception e)
{
Debug.Print(e.Message);
return e.HResult.ToString();
}
}
string[]ParamName=新字符串[1];//可能不止一个
object[]ParamValue=新对象[1];
ParamName[0]=“已插入”;
ParamValue[0]=插入日期;//将日期插入插入的简单格式yyyyMMdd
ParamName[1]=“已更新”;
ParamValue[1]=DateTime.Now.ToString(“yyyy-MM-ddThh:MM:ss”);//将当前日期插入更新为完成日期
strSQL=“插入标准值(16777213,‘新名称’,1,‘新名称说明’,0,,,1,,,0,1)”;
string res=InsertSQL(strSQL,ParamName,ParamValue);
公共字符串InsertSQL(字符串strSql,字符串[]ParamName,对象[]ParamValue)
{
尝试
{
OleDbCommand cmd=新的OleDbCommand(strSql、sqlConn);
for(int i=0;i
请检查小写-我的示例中的大写-我在Stackoverflow中编写了它,而不是在visual studio中-因此我的示例中可能有一个小错误。
这并不能解决tryParse传递错误值的问题,因为它正按照名称所说的那样:它正试图将某个字符串解析为有效日期。也许这应该是另一种情况。因此,这个答案只是针对插入代码中的转换错误如果不需要时间戳,SQL Server应该接受allwasy字符串作为格式为“yyyyMMdd”的日期。如果需要完整的日期,那么使用一个参数,这样写:date.Now.ToUniversalTime.ToString(“yyyy-MM-ddThh:MM:ss”),当您进行转换时,您只需说“此字符串可以转换为此格式的datetime对象吗?”。如果您的数据中有一些带有小数秒的日期,它仍然会说可以,因为您的检查不是关于它是否可以转换为smallDateTime,而是它是否可以转换为基于格式的c#DateTime对象。是否有任何异常的日期?如果出现异常,是否可以显示sql插入代码?是否尝试插入DateTime.TryParse()输出的DateTime参数?那个日期变量包含什么?此外,您还可以执行isValidBookedDate=DateTime.TryParseExact(..)以保存作为sql insert语句一部分的IsValidBookeddates的if分支和手动赋值,您还应该尝试将DateTime对象转换为smallDateTime,以确保可以转换。谢谢。是否应在表中以:yyyy-MM-ddThh:MM:ss格式保存日期。我的字符串格式为2019年12月21日00:00:00,我注意到的另一件事是,在SQL表中——当我运行SQL查询时,如果日期格式为mm/dd/yyyy hh:mm:ss,则插入数据。我在excel中的数据是dd/mm/yyyy hh:mm:ss。我尝试了下面的代码,并在first Thread SQL Server Acct中对其进行了更新,包括短日期(如“20200420”)或长日期(如通用格式“yyy-MM-ddThh:MM:ss”)或本地格式。您已经将Excel值转换为有效的日期时间并为其分配了变量。您将其命名为date—在我的示例中,我将其命名为mydate,并将其命名为insertdate,用于格式化的示例。在我的示例中有一个错误:我在sql命令中使用Mydate,但它应该使用insertDate。
string[] ParamName = new string[1]; // can be more then one
object[] ParamValue = new object[1];
ParamName[0] = "Inserted" ;
ParamValue[0] = insertDate ; // will insert you date into inserted - simple format yyyyMMdd
ParamName[1] = "updated" ;
ParamValue[1] = DateTime.Now.ToString("yyyy-MM-ddThh:mm:ss"); // will insert current date into updated as complete date
strSQL = "insert into criteria values( 16777213, 'New name',1,'New name description',0,?,1,?,0,1)";
string res = InsertSQL(strSQL, ParamName, ParamValue);
public string InsertSQL(string strSql, string[] ParamName, Object[] ParamValue)
{
try
{
OleDbCommand cmd = new OleDbCommand(strSql, sqlConn);
for (int i = 0; i < ParamName.Length; i++)
{
if (ParamName[i] != "")
{
cmd.Parameters.AddWithValue(ParamName[i], ParamValue[i]);
}
}
cmd.ExecuteNonQuery();
return "OK";
}
catch (Exception e)
{
Debug.Print(e.Message);
return e.HResult.ToString();
}
}