Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误:将varchar数据类型转换为smalldatetime数据类型导致值超出范围_C#_Sql Server - Fatal编程技术网

C# 错误:将varchar数据类型转换为smalldatetime数据类型导致值超出范围

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[

我试图从C#向SQL Server表中插入数据,这是一个
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 Server
Insert 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(); 
                    }
                }