Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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# 将文件中的日期从yyyyMMdd转换为以MMddYYYY的形式存储在SQL中_C#_Sql Server - Fatal编程技术网

C# 将文件中的日期从yyyyMMdd转换为以MMddYYYY的形式存储在SQL中

C# 将文件中的日期从yyyyMMdd转换为以MMddYYYY的形式存储在SQL中,c#,sql-server,C#,Sql Server,我有一个以这种格式显示日期的文件:20150530。在将它们插入SQL表之前,我需要将它们格式化为以下格式:05302015。我最初的代码是: private string NormalizeDate(string strInput) { string strOutput; DateTime date; if (DateTime.TryParseExact(strInput, "YYYYMMdd", null, System.Globa

我有一个以这种格式显示日期的文件:20150530。在将它们插入SQL表之前,我需要将它们格式化为以下格式:05302015。我最初的代码是:

private string NormalizeDate(string strInput)
    {
        string strOutput;
        DateTime date;


        if (DateTime.TryParseExact(strInput, "YYYYMMdd", null, System.Globalization.DateTimeStyles.None, out date))
        {
            strOutput = date.ToString("MMddYYYY");
            return strOutput.Trim();
        }
        else
        {

            return strInput.Trim();
        }
    }
但是,在我插入SQL之前,日期的格式不会改变。我希望在表中插入时,日期的格式为MMddYYYY(不带破折号或空格)。然后使用这种格式,我需要将这些日期合并到不同的表中,但格式必须是mmddyyy


我唯一的另一个选择是使用某种查询,可以从表1(20150530)中获取原始日期,然后将格式转换为(05302015)格式的表2。我尽量不让任何人感到困惑。表1的数据类型是datetime,它将插入到表2中的列是nvarchar。

如果它存储为datetime,则

declare @time date ='20100530'

select
replace(convert(varchar, @time, 101),'/','')
如果它存储为int,那么

declare @time int ='20100530'

select
replace(convert(varchar, cast(CONVERT(varchar, @time)as DATE),101),'/','')

如果你在C#和Sql Server之间交谈时担心格式问题,那么两者都会将其更改为05302010,你已经输了。关心格式意味着您使用的技术非常容易受到sql注入攻击

而不是像这样:

//Don't **EVER** put data into SQL strings this, or I will hunt you down and kill your dog.
string sql = "INSERT INTO [table] (column1, column2) VALUES ('{0}', '{1}')";
foreach (var values in data)
{
    sqlcmd.CommandText = string.Format(sql, values[0], NormalizeDate(values[1]));
    sqlcmd.ExecuteNonQuery();
}
sqlcmd.CommandText = "INSERT INTO [table] (column1, column2) VALUES (@column1, @column2)";
sqlcmd.Parameters.Add("@column1", SqlDbType.NVarChar, 50);
sqlcmd.Parameters.Add("@column2", SqlDbType.DateTime);
foreach (var values in data)
{
    sqlcmd.Parameters["@column1"].Value = values[0];
    sqlcmd.Parameters["@column2"].Value = DateTime.Parse(values[1]);
    sqlcmd.ExecuteNonQuery();
}
您需要这样做:

//Don't **EVER** put data into SQL strings this, or I will hunt you down and kill your dog.
string sql = "INSERT INTO [table] (column1, column2) VALUES ('{0}', '{1}')";
foreach (var values in data)
{
    sqlcmd.CommandText = string.Format(sql, values[0], NormalizeDate(values[1]));
    sqlcmd.ExecuteNonQuery();
}
sqlcmd.CommandText = "INSERT INTO [table] (column1, column2) VALUES (@column1, @column2)";
sqlcmd.Parameters.Add("@column1", SqlDbType.NVarChar, 50);
sqlcmd.Parameters.Add("@column2", SqlDbType.DateTime);
foreach (var values in data)
{
    sqlcmd.Parameters["@column1"].Value = values[0];
    sqlcmd.Parameters["@column2"].Value = DateTime.Parse(values[1]);
    sqlcmd.ExecuteNonQuery();
}
这里的要点是使用C#datetime类型与SQLServer datetime列进行对话,并使用参数化查询来实现这一点

这样做时,您就不再关心格式了。所有这些都是由ADO.Net在幕后为您处理的。此外,这是确保代码不易受到sql注入攻击的唯一故障安全方法

现在,几乎可以肯定的是,在所有这些之后,Sql Server没有使用您期望的格式存储datetime列。事实上,Sql Server使用的日期时间值的二进制格式甚至不是人类可读的。您在SQL中看到的格式只是查询工具为了方便而显示的格式。没关系,因为它的工作原理是一样的。当您从数据库中检索数据时,ADO.Net将再次执行此操作,您将获得一个.Net DateTime值,您可以将其格式化为您的核心内容


数据库应该是这样工作的:数据库中静止的数据以对数据库最有效的格式存在,而查询或应用程序的工作就是为您需要的特定演示案例及时格式化数据。

列是什么类型的?如果是日期,格式就不重要了……如果不是日期,为什么不是日期呢?:)但说真的,到目前为止你试过什么?你哪里有问题?现在是约会时间。我需要改变这种格式的一个具体和独特的原因。有什么想法吗?@JustinSmith如果是日期时间,SQL希望您将其传递为:
20100530
-
YYYYMMDD
您是通过
BULK
还是常规
INSERT
命令插入?