【问题标题】:Error: The conversion of a varchar data type to a smalldatetime data type resulted in an out-of-range value错误:将 varchar 数据类型转换为 smalldatetime 数据类型导致值超出范围
【发布时间】:2020-04-03 16:32:49
【问题描述】:

我正在尝试从 C# 将数据插入到 SQL Server 表中,这是一个 smalldatetime 值。在表格中,我可以看到格式为 2013-10-24 00:00:00 的数据。

在我的代码中,我正在执行以下操作以在插入数据之前检查 dataTable 中可用的数据是否具有正确的日期时间格式。在 Excel 中,包含字符串(日期值)的行可以是我放入格式数组中的任何格式。在 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
}

【问题讨论】:

  • 如果不需要时间戳,SQL Server 应该接受所有格式为“yyyyMMdd”的字符串作为日期。如果需要完整日期,则使用参数并像这样编写:Date.Now.ToUniversalTime.ToString("yyyy-MM-ddThh:mm:ss")
  • 当您进行转换时,您只需说“这个字符串可以转换成这种格式的日期时间对象吗”。如果您的数据有一些带有小数秒的日期,它仍然会说它可以,因为您的检查不是关于它是否可以转换为 smallDateTime,而是它是否可以转换为基于格式的 c# DateTime 对象。你有什么不寻常的约会吗?
  • 如果出现异常,能否显示 sql 插入代码?
  • 您是否尝试插入 DateTime.TryParse() 输出的 DateTime 参数?该日期变量包含什么?此外,您可以执行 isValidBookedDate = DateTime.TryParseExact(..) 来保存 if 分支和手动分配 isValidBookedDate
  • 作为 sql insert 语句的一部分,您还应该尝试将 datetime 对象转换为 smallDateTime 以确保它可以被转换。

标签: c# sql-server


【解决方案1】:

让我们有一个名为条件的表,其中包含以下字段: id、名称、等级、描述、删除、插入、注册用户、更新、更新用户、使用)

    if (DateTime.TryParseExact(dtrow[5].ToString().Trim(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None,out Mydate)) 
:
:
string insertDate =  (Mydate.Year() + MyDate.Month() + MyDate.Day()
string strSQL = "insert into criteria values (16777214,'new name',1,'new name description',0,'" + insertDate + "',1,'17600101',0,1)"

更多的工作,但更好的用户参数查询。这里我用的是 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(); 
                    }
                }

请检查小写字母 - 我的示例中的大写字母 - 我是在 Stackoverflow 中而不是在 Visual Studio 中编写的 - 所以我的示例中可能存在一个小错误。 这不会解决 tryParse 可以传递错误值的问题,因为它正在执行名称所说的操作:它正在尝试将某些字符串解析为有效日期。也许这应该是一个不同的情况。所以这个答案只是你在插入代码中的转换错误

【讨论】:

  • 谢谢。日期是否应该以表格中的格式保存:yyyy-MM-ddThh:mm:ss。我的字符串格式为 21/12/2019 00:00:00
  • 我注意到的另一件事是,在 SQL 表中 - 当我运行 sql 查询时,如果日期格式为 mm/dd/yyyy hh:mm:ss,则会插入数据。我在 excel 中的数据是 dd/mm/yyyy hh:mm:ss。我尝试了下面的代码,并在第一个线程中更新了它
  • SQL Server 接受像“20200420”这样的短日期或像“yyyy-MM-ddThh:mm:ss”这样的通用格式的长日期,或者可能是您拥有的本地格式。跨度>
  • 您已经将 Excel 值转换为有效的日期时间并为其分配了一个变量。您将其命名为日期 - 在我的示例中,我将其命名为 mydate 并为格式化的插入日期。在我的示例中有一个错误:我在 sql 命令中使用 Mydate 但它应该是 insertDate。
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
相关资源
最近更新 更多