0

我正在尝试获取日期,然后将其添加到数据库中。

为此,我正在使用(作为示例..)

If vDay = "TUESDAY" Or vDay = "2" Then             
     vDateEnd = DateTime.Now.AddDays(-2)
End If

然后我想将 vDateEnd 放入 SQL 中。如果我硬编码“2012 年 9 月 16 日”,它可以工作,但我玩过(正如您从注释掉的行中看到的那样)无济于事。

'report not found so we need to create one
'Create dates in the report if doe not exist
'### Update
Dim ConnectionString3 As String = System.Web.Configuration.WebConfigurationManager.ConnectionStrings("mySQLConnectionString").ConnectionString
Dim dsNames3 As SqlDataSource
Dim sSQL3 As String

dsNames3 = New SqlDataSource
dsNames3.ConnectionString = sConnString

sSQL3 = "spWeeklyReportDatesCreate"

dsNames3.UpdateCommand = sSQL3
dsNames3.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure
dsNames3.UpdateParameters.Clear()
dsNames3.UpdateParameters.Add("DateStart", "09/16/2012")
'dsNames3.UpdateParameters.Add("DateEnd", "09/01/2013")
dsNames3.UpdateParameters.Add("DateEnd", (Mid(Date.Now.AddDays(-2), 1, 10)))
'  dsNames3.UpdateParameters.Add("DateEnd", DateTime.Now.AddDays(-2).ToShortDateString("mm/dd/yyyy"))
dsNames3.UpdateParameters.Add("RunCompleted", "N")
dsNames3.Update()
dsNames3 = Nothing

存储过程

USE [db]
GO
/****** Object:  StoredProcedure [dbo].[spWeeklyReportDatesCreate]    Script Date: 16/09/2013 15:23:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spWeeklyReportDatesCreate]

@DateStart  smalldatetime,
@DateEnd smalldatetime,
@RunCompleted  nvarchar(1)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.

INSERT INTO [tblweeklyreports] 

(DateStart, DateEnd,RunCompleted) 
VALUES 
(@DateStart, @DateEnd,@RunCompleted)

--select @AnswerID=@@IDENTITY

END
Datebase - both set to 'datetime' at the moment though all of these parameters have been played with i.e. all SmallDate, DateTime, Date etc... 
4

2 回答 2

1

改变这个:

dsNames3.UpdateParameters.Add("DateEnd", (Mid(Date.Now.AddDays(-2), 1, 10)))

对此:

dsNames3.UpdateParameters.Add("DateEnd", SqlDbType.SmallDateTime).Value = vDateEnd

这允许您将 VB.Net 日期类型直接分配给 sql 参数。无需担心格式:ADO.Net 处理所需的任何转换。在您使用 DateTime 或 SmallDateTime sql 类型的任何地方进行类似的更改。

你之前所做的让 ADO.Net 在将数据发送到 Sql Server 之前尝试猜测你的 sql 参数类型,在这种情况下它猜错了。如果您发现自己将 VB.Net 日期类型转换为与 SQL 一起使用的字符串(例如使用 Mid() 函数),那么您做错了什么

事实上,您几乎应该始终为 sql 参数使用显式数据库类型,因为即使 ADO.Net 猜测几乎正确,这样它似乎工作,细微的错误仍然会产生很大的影响。如您所见,ADO.Net 经常使用 NChar 作为其参数类型。这将导致 sql server 稍后进行额外的转换,以匹配数据库中实际存在的任何类型。在某些情况下,Sql Server 会尝试对潜在结果集中的每条记录进行这种转换。在其他情况下,它会导致 Sql Server 无法识别可以使用索引。这两种情况都可能导致显着的性能差异。所以,请告诉 ADO.Net 您希望它使用什么参数类型。

于 2013-09-16T16:34:29.890 回答
0

好的,看起来它正在工作..

我得到了一些其他更新代码,但我不明白其中的差异,看看为什么它不起作用。任何想法都会很好理解。

 Dim connection As SqlConnection
                Dim command As New SqlCommand
                Dim ds As New DataSet
                Dim ConnectionString As String = System.Configuration.ConfigurationManager.ConnectionStrings("mySQLConnectionString").ToString()
                connection = New SqlConnection(ConnectionString)

                connection.Open()
                command.Connection = connection

                command.CommandText = "spWeeklyReportDatesCreate"
                command.CommandType = CommandType.StoredProcedure
                command.Parameters.AddWithValue("DateStart", SqlDbType.SmallDateTime).Value = "09/16/2012"
                command.Parameters.AddWithValue("DateEnd", SqlDbType.SmallDateTime).Value = DateTime.Parse(Date.Now.AddDays(-2))
                command.Parameters.AddWithValue("RunCompleted", "N")
                command.ExecuteNonQuery()
于 2013-09-17T14:16:46.107 回答