从Datatable写入SQL Server时,数据存储不正确

时间:2014-12-27 09:57:02

标签: sql-server vb.net date

我使用以下代码创建数据表,然后写回SQL数据库。

如您所见,我将日期值转换为类型103,因此它应该是dd / mm / yyyy。

如果我查看数据表,它的格式正确,但当它写回SQL数据库时,该值将存储为yyyy-mm-dd

创建数据表(dt)的代码:

                    Dim conn9 As New SqlClient.SqlConnection
                    With conn9
                        .ConnectionString = "server=inlt01\SQLEXPRESS; database=DaisyBilling; integrated security=yes"
                        .Open()
                    End With

                    Dim cmd9 As New SqlClient.SqlCommand
                    With cmd9
                        .CommandText = "SELECT [CustomerCLI], LEFT(MIN(DATENAME(MONTH,[CallDate])),3) AS [Short Month Name], [CustomerLookup], [CustomerName], ROUND (SUM ([SalesPrice]),2) as [Sum of Buy Price], ROUND (SUM ([Sell Price]),2) as [Sum of Sell Price],[Tariff Lookup],[Qty],[LineDescription],[Billingmonth], (SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(MAX ([CallDate]))-1),MAX ([CallDate])),103)) AS FromDate, (SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,MAX ([CallDate])))),DATEADD(mm,1,MAX ([CallDate]))),103)) as ToDate FROM [DaisyBilling].[dbo].[" + TextBox1.Text + "] GROUP BY [CustomerCLI], [CustomerLookup],[CustomerName],[Tariff Lookup],[Qty],[LineDescription],[Billingmonth] ORDER BY [CustomerLookup]"
                        .CommandType = CommandType.Text
                        .CommandTimeout = 30
                        .Connection = conn9
                    End With
                    Dim dt As New DataTable
                    dt.Load(cmd9.ExecuteReader)

                    With ViewBillForm.DataGridView1
                        .AutoGenerateColumns = True
                        .DataSource = dt
                    End With

                    cmd9.Dispose()
                    cmd9 = Nothing

将数据表导出到SQL dB的代码:

                    Dim conn2 As New SqlClient.SqlConnection
                    With conn2
                        .ConnectionString = "server=inlt01\SQLEXPRESS; database=MasterBill; integrated security=yes"
                        .Open()
                    End With

                    Using copy As New SqlBulkCopy(conn2)

                        copy.DestinationTableName = "dbo.DaisyCallsCurrentBill"
                        copy.WriteToServer(dt)

                    End Using

                    conn.Close()
                    conn.Dispose()

如何在写回数据库时正确存储我的值?

由于

1 个答案:

答案 0 :(得分:0)

您的代码应该处理日期的呈现方式,而不应该真正关心SQL如何存储数据。由于您希望日期以dd/mm/yyyy格式表示,请在相应的网格列上设置显示格式。例如:

DataGridView1.Columns("FromDate").DefaultCellStyle.Format = "dd/MM/yyyy"

这会将存储在DataTable(被推回到SQL)中的数据保存为日期,但会以您想要的格式显示。

更多信息可以解释您实际收到错误的原因:

SQL Server始终以yyyy-mm-dd格式表示日期。您可能已经注意到,您实际上可以使用以下内容将值写入日期字段:

UPDATE MyTable
SET DateField = '2014-11-10' -- This will store a date for Nov 10, 2104.
WHERE Id = 132

但是,如果您尝试更新mm/dd/yyyydd/mm/yyyy中的相同日期,则SQL可能会“混淆”,因为它不知道您想要的格式是前者还是后者。

-- This is dangerous.
UPDATE MyTable
SET DateField = '11/10/2014' -- Is this Nov 10, 2014 or Oct 11, 2014?
WHERE Id = 132
相关问题