【问题标题】:Error saving in SQL Server if system datetime format is changed如果更改系统日期时间格式,则在 SQL Server 中保存时出错
【发布时间】:2015-07-25 12:47:18
【问题描述】:

我正在使用 C# 应用程序将 Excel 文件中的数据导入 SQL Server。我的工作表包含一些日期时间列。

无论我的系统日期时间设置为什么格式(dd/mm/yyyymm/dd/yyyy 或任何其他格式)以及我的日期时间值在 Excel 工作表中的格式如何,我都可以在 SQL Server 中正确加载它,而无需任何错误。目前,如果我的系统日期时间为mm/dd/yyyy,则保存数据,但如果我将系统格式更改为dd/mm/yyyy,则保存操作失败。

保存功能:

public int InsertSetting(DataRow drow)
    {
        int Result = 0;

        try
        {

            OdbcParameter[] p = new OdbcParameter[9];
            p[0] = new OdbcParameter("@ID", drow["ID"].ToString().Trim());
            p[1] = new OdbcParameter("@ComID", drow["CompanyID"].ToString().DbNullIfNullOrEmpty());
            p[2] = new OdbcParameter("@Mod", drow["ModuleID"].ToString().DbNullIfNullOrEmpty());
            p[3] = new OdbcParameter("@Stat", drow["Status"].ToString());
            p[4] = new OdbcParameter("@EnterBy", drow["EnterBy"].ToString().DbNullIfNullOrEmpty());
            p[5] = new OdbcParameter("@EnterDate", (drow["EnterDate"].ToString() == "" || drow["EnterDate"].ToString() == "NULL") ? (object)DBNull.Value : drow["EnterDate"].ToString());
            p[6] = new OdbcParameter("@UpdateBy", drow["UpdateBy"].ToString().DbNullIfNullOrEmpty());
            p[7] = new OdbcParameter("@UpdateDate", (drow["UpdateDate"].ToString() == "" || drow["UpdateDate"].ToString() == "NULL") ? (object)DBNull.Value : drow["UpdateDate"].ToString());
            p[8] = new OdbcParameter("@Mode", 7);


            Result = //calling stored procedure to save data

        }
        catch (Exception ex)
        {
             MessageBox.Show(ex.Message, "InsertSetting()");


        }
        return Result;

    }

mm/dd/yyyy 格式读取输入日期和更新日期。

我无法理解到底是什么问题以及我与系统 Datetime 格式有什么关系。

【问题讨论】:

  • 向我们展示您的 C# 代码以将 Excel 工作表加载到 SQL Server 中!
  • 如果您的目标表需要日期,则创建日期类型的参数而不是字符串。这是你所有问题的根源
  • EnterDate 和 UpdateDate 是过程中的日期时间参数。它们不是 sp 中的 varchar。
  • 你试过SET DATEFORMAT MDY;
  • 你希望我使用 SET DATEFORMAT MDY;在 sql server 中?但是我在 excel 中的日期值可以是任何格式,系统日期格式可以是任何格式..

标签: c# sql sql-server excel


【解决方案1】:

如果drow["EnterDate"]drow["UpdateDate"] 是日期时间,您可以在ToString() 中输入自定义格式。

通过 ADO.net 将日期保存到 SQL Server,虽然我承认这不是一种正式的方式,但我发现无论本地/服务器日期时间格式设置如何,将其格式化为 ToString("yyyy-MM-dd HH:mm:ss") 总是更安全。

【讨论】:

    【解决方案2】:

    假设 drow["EnterDate"] 是字符串,您应该在传递给 SQL Server 之前将日期参数转换为 DateTime。如果第一部分是 1 位或 2 位数字,SQL Server 将日期视为 MM/DD/YYYY。或者,您可以将日期传递为 yyyyMMdd 格式。

    稍微简化一下:

    p[5] = new OdbcParameter("@EnterDate", !string.IsNullOrEmpty(drow["EnterDate"].ToString()) ? DateTime.Parse((string)drow["EnterDate"]) : DBNull.Value);
    

    p[5] = new OdbcParameter("@EnterDate", !string.IsNullOrEmpty(drow["EnterDate"].ToString) ? DateTime.Parse((string)drow["EnterDate"]).ToString("yyyyMMdd HH:mm:ss") : DBNull.Value);
    

    如果 drow["EnterDate"] 已经是 DateTime 类型,则;

    p[5] = new OdbcParameter("@EnterDate", drow["EnterDate"] != DBNull.Value ? (DateTime)drow["EnterDate"] : DBNull.Value);
    

    p[5] = new OdbcParameter("@EnterDate", drow["EnterDate"] != DBNull.Value ? ((DateTime)drow["EnterDate"]).ToString("yyyyMMdd HH:mm:ss") : DBNull.Value);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多