Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# 未插入格式化的日期时间值-sql_C#_.net_Sql Server_Datetime - Fatal编程技术网

C# 未插入格式化的日期时间值-sql

C# 未插入格式化的日期时间值-sql,c#,.net,sql-server,datetime,C#,.net,Sql Server,Datetime,我正试图从代码中执行此查询 using (SqlCommand usageMapCmd = new SqlCommand()) { usageMapCmd.Connection = sqlConnection; usageMapCmd.CommandType = CommandType.Text; usageMapCmd.CommandText = "INSERT [dbo].[Analytics_DeviceLog] ([IPAddress], [OS], [OSVer

我正试图从代码中执行此查询

using (SqlCommand usageMapCmd = new SqlCommand())
{
    usageMapCmd.Connection = sqlConnection;
    usageMapCmd.CommandType = CommandType.Text;
    usageMapCmd.CommandText = "INSERT [dbo].[Analytics_DeviceLog] ([IPAddress], [OS], [OSVersionMajor], [OSVersionMinor], [City], [Country], [CountryCode], [Region], [RegionCode], [PostalCode], [TimeZone], [Browser], [BrowserVersionMajor], [BrowserVersionMinor], [Device], [Model], [Platform], [Latitude], [Longitude], [Languages], [UserGuid], [LoginTimeUtc], [LocationAccuracy]) VALUES (N'119.15.106.186', N'Windows 10', NULL, NULL, N'Canberra', N'Australia', N'AU', N'Australian Capital Territory', N'ACT', N'2600', N'Australia/Sydney', N'@Browser', 60, CAST(0.00 AS Decimal(18, 2)), N'@Device', N'', N'WinNT', CAST(-35.305000 AS Decimal(9, 6)), CAST(149.141200 AS Decimal(9, 6)), N'en-US,en;q=0.8,vi;q=0.6', N'99999999-9999-9999-9999-999999999999', CAST(N'@LoginTimeUtc' AS DateTime), N'Low')";
    usageMapCmd.Parameters.AddWithValue("@Browser", (string)browsers[rndBrowsers.Next(browsers.Count)]);
    usageMapCmd.Parameters.AddWithValue("@Device", (string)devices[rndDevices.Next(devices.Count)]);
    usageMapCmd.Parameters.AddWithValue("@LoginTimeUtc", loginTimeUtc.ToString("yyyy-mm-dd hh:mm:ss"));
    usageMapCmd.ExecuteNonQuery();
}
我遇到的问题是,无论我输入的
@LoginTimeUtc
的格式是什么,我都会得到一个错误

从字符串转换日期和/或时间时转换失败

奇怪的是,当我从SQL Server Management Studio手动执行查询时,例如
2017-08-21 05:45:52.830
这将正常工作,因此我认为问题不是来自我的数据库

我试过了
DateTime.Parse(loginTimeUtc)
但运气不好。我甚至尝试用简单的
DateTime替换
loginTimeUtc.ToString(“yyyy-mm-dd hh:mm:ss”)
。现在
,但它不起作用。你知道我可能做错了什么吗

使用SQL Server Profiler,我得到的是:

exec sp_executesql N'INSERT [dbo].[Analytics_DeviceLog] ([IPAddress], [OS], [OSVersionMajor], [OSVersionMinor], [City], [Country], [CountryCode], [Region], [RegionCode], [PostalCode], [TimeZone], [Browser], [BrowserVersionMajor], [BrowserVersionMinor], [Device], [Model], [Platform], [Latitude], [Longitude], [Languages], [UserGuid], [LoginTimeUtc], [LocationAccuracy]) VALUES (N''119.15.106.186'', N''Windows 10'', NULL, NULL, N''Canberra'', N''Australia'', N''AU'', N''Australian Capital Territory'', N''ACT'', N''2600'', N''Australia/Sydney'', N''@Browser'', 60, CAST(0.00 AS Decimal(18, 2)), N''@Device'', N'''', N''WinNT'', CAST(-35.305000 AS Decimal(9, 6)), CAST(149.141200 AS Decimal(9, 6)), N''en-US,en;q=0.8,vi;q=0.6'', N''99999999-9999-9999-9999-999999999999'', N''@LoginTimeUtc'', N''Low'')',N'@Browser nvarchar(6),@Device nvarchar(17),@LoginTimeUtc datetime',@Browser=N'Chrome',@Device=N'Samsung Galaxy S4',@LoginTimeUtc='2009-02-19 21:56:00'

要将DateTime转换为格式化字符串,请将它们转换回数据库和存储的DateTime,您可以使用
参数直接传递DateTime对象,如下所示。通过指定
SqlDbType
添加

 usageMapCmd.CommandText = "INSERT [dbo].[Analytics_DeviceLog] ([LoginTimeUtc]) VALUES (@LoginTimeUtc)";
 usageMapCmd.Parameters.Add("@LoginTimeUtc",SqlDbType.DateTime).value = loginTimeUtc;

要将DateTime转换为格式化字符串,请将它们转换回数据库和存储的DateTime,您可以使用
参数直接传递DateTime对象,如下所示。通过指定
SqlDbType
添加

 usageMapCmd.CommandText = "INSERT [dbo].[Analytics_DeviceLog] ([LoginTimeUtc]) VALUES (@LoginTimeUtc)";
 usageMapCmd.Parameters.Add("@LoginTimeUtc",SqlDbType.DateTime).value = loginTimeUtc;

我认为Un Lucky的答案是正确的解决方案,但是您可以通过将命令文本更改为

usageMapCmd.CommandText = "INSERT [dbo].[Analytics_DeviceLog] ([IPAddress], [OS], [OSVersionMajor], [OSVersionMinor], [City], [Country], [CountryCode], [Region], [RegionCode], [PostalCode], [TimeZone], [Browser], [BrowserVersionMajor], [BrowserVersionMinor], [Device], [Model], [Platform], [Latitude], [Longitude], [Languages], [UserGuid], [LoginTimeUtc], [LocationAccuracy]) VALUES (N'119.15.106.186', N'Windows 10', NULL, NULL, N'Canberra', N'Australia', N'AU', N'Australian Capital Territory', N'ACT', N'2600', N'Australia/Sydney', N'@Browser', 60, CAST(0.00 AS Decimal(18, 2)), N'@Device', N'', N'WinNT', CAST(-35.305000 AS Decimal(9, 6)), CAST(149.141200 AS Decimal(9, 6)), N'en-US,en;q=0.8,vi;q=0.6', N'99999999-9999-9999-9999-999999999999', CAST(@LoginTimeUtc AS DateTime), N'Low')";
i、 e.变化

CAST(N'@LoginTimeUtc' AS DateTime) 

您的代码试图转换字符串“@LoginTimeUtc”,而不是您正在传递的参数

编辑:确定在创建一个说服CodingYoshi的示例时,我发现上面代码的另一个问题是使用的日期格式化程序,它应该是“yyy-MM-dd hh:MM:ss”而不是“yyy-MM-dd hh:MM:ss”。不管怎样,我已经测试了以下内容

using (SqlCommand cmd = new SqlCommand())
{
    cmd.Connection = new SqlConnection("Data Source=(local);Initial Catalog=mytstDB;Integrated Security=True;pooling=true;Min Pool Size=5; Max Pool Size=10");
    cmd.Connection.Open();
    cmd.CommandText = "SELECT * FROM tblUser WHERE CreatedDate <= CAST(N'@LoginTimeUtc' AS DateTime)";
    cmd.Parameters.AddWithValue("@LoginTimeUtc", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
    SqlDataReader rdr = cmd.ExecuteReader();
    rdr.Read();
}
使用(SqlCommand cmd=new SqlCommand())
{
cmd.Connection=newsqlconnection(“数据源=(本地);初始目录=mytstDB;集成安全性=True;池=True;最小池大小=5;最大池大小=10”);
cmd.Connection.Open();

cmd.CommandText=“SELECT*FROM tblUser WHERE CreatedDate我认为unlucky的答案是正确的解决方案,但是您可以通过将命令文本更改为

usageMapCmd.CommandText = "INSERT [dbo].[Analytics_DeviceLog] ([IPAddress], [OS], [OSVersionMajor], [OSVersionMinor], [City], [Country], [CountryCode], [Region], [RegionCode], [PostalCode], [TimeZone], [Browser], [BrowserVersionMajor], [BrowserVersionMinor], [Device], [Model], [Platform], [Latitude], [Longitude], [Languages], [UserGuid], [LoginTimeUtc], [LocationAccuracy]) VALUES (N'119.15.106.186', N'Windows 10', NULL, NULL, N'Canberra', N'Australia', N'AU', N'Australian Capital Territory', N'ACT', N'2600', N'Australia/Sydney', N'@Browser', 60, CAST(0.00 AS Decimal(18, 2)), N'@Device', N'', N'WinNT', CAST(-35.305000 AS Decimal(9, 6)), CAST(149.141200 AS Decimal(9, 6)), N'en-US,en;q=0.8,vi;q=0.6', N'99999999-9999-9999-9999-999999999999', CAST(@LoginTimeUtc AS DateTime), N'Low')";
i、 e.变化

CAST(N'@LoginTimeUtc' AS DateTime) 

您的代码试图转换字符串“@LoginTimeUtc”,而不是您正在传递的参数

EDIT:OK在创建一个说服CodingYoshi的示例时,我发现上面代码的另一个问题是使用的日期格式化程序,它应该是“yyyy-MM-dd hh:MM:ss”而不是“yyyy-MM-dd hh:MM:ss”。无论如何,我已经测试了以下内容

using (SqlCommand cmd = new SqlCommand())
{
    cmd.Connection = new SqlConnection("Data Source=(local);Initial Catalog=mytstDB;Integrated Security=True;pooling=true;Min Pool Size=5; Max Pool Size=10");
    cmd.Connection.Open();
    cmd.CommandText = "SELECT * FROM tblUser WHERE CreatedDate <= CAST(N'@LoginTimeUtc' AS DateTime)";
    cmd.Parameters.AddWithValue("@LoginTimeUtc", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
    SqlDataReader rdr = cmd.ExecuteReader();
    rdr.Read();
}
使用(SqlCommand cmd=new SqlCommand())
{
cmd.Connection=newsqlconnection(“数据源=(本地);初始目录=mytstDB;集成安全性=True;池=True;最小池大小=5;最大池大小=10”);
cmd.Connection.Open();

cmd.CommandText=“从tblUser中选择*,其中CreatedDate我看到您使用了
loginTimeUtc.ToString(“yyyy-mm-dd hh:mm:ss”)
,将其更改为
loginTimeUtc.ToString(“yyy-mm-dd hh:mm:ss”)

请注意,MM给你2位数的月份,而MM给你2位数的分钟


要阅读有关自定义日期时间格式的更多信息,请参见

我看到您使用了
loginTimeUtc.ToString(“yyyy-mm-dd hh:mm:ss”)
,将其更改为
loginTimeUtc.ToString(“yyyy-mm-dd hh:mm:ss”)

请注意,MM给你2位数的月份,而MM给你2位数的分钟



要了解有关自定义日期时间格式的更多信息,请参见

您的代码中的
loginTimeUtc
类型是什么?@幸运的是,它是DateTime类型。您可以将日期参数作为DateTime类型插入。您无需将其转换为字符串。您正在将对象C#
System.DateTime
转换为字符串,然后在更新中,将其转换回SQL DateTime再次,只需删除您的强制转换,并删除您的
ToString()
@JackyI已删除强制转换为DateTime和ToString(“yyyy-mm-dd hh:mm:ss”)但是仍然出现相同的错误代码中的
loginTimeUtc
类型是什么?@幸运的是它是类型DateTime您可以将日期参数作为DateTime类型插入。您不需要将其转换为字符串您正在将对象C#
系统.DateTime
转换为字符串,然后在更新中,您再次转换回SQL DateTime,只需remove您的强制转换,并删除您的
ToString()
@JackyI已删除强制转换为DateTime和ToString(“yyy-mm-dd hh:mm:ss”),但仍然收到相同的错误我仍然有“从字符串转换日期和/或时间时转换失败”错误于this@sunsun我会拿出sql事件探查器,检查实际执行的查询。如果您没有按照此答案中的说明实现,那么您在命令文本中的LoginTimeUtc参数周围仍然有引号,它应该是…N“9999999-9999-9999-9999999-9999999999”、@LoginTimeUtc、N“Low”)…而不是…N“9999999999-9999”-9999-9999999999'',N''@LoginTimeUtc'',N''Low'')@我现在很幸运,它对我有用。谢谢你的帮助:)谢谢it@sunsun您应该将他的答案标记为“答案”,即单击“当从字符串转换日期和/或时间时,转换失败”错误于this@sunsun我会拿出sql事件探查器,检查实际执行的查询。如果您没有按照此答案中的说明实现,那么您在命令文本中的LoginTimeUtc参数周围仍然有引号,它应该是…N“9999999-9999-9999-9999999-9999999999”、@LoginTimeUtc、N“Low”)…而不是…N“9999999999-9999”-9999-9999999999'',N''@LoginTimeUtc'',N''Low'')@我现在很幸运,它对我有用。谢谢你的帮助:)谢谢it@sunsun您应该将他的答案标记为“答案”,即单击勾选键。您的代码实际上是在尝试转换字符串“@LoginTimeUtc”:我不这么认为。它将把应用程序端的日期插入单引号中。@CodingYos