2

正如主题所暗示的那样。我正在制作一个小程序,您可以在其中浏览和处理一堆数据。问题是虽然向 SQL 表中插入新行可以正常工作,但使用相同的方法进行更新会导致 smalldatetime 变量出现问题。

我注意到使用分析器 exec 命令在日期上加上双引号,但我似乎无法摆脱它。加上插入时会发生相同的双引号,并且效果很好。该过程中的命令如下所示:

执行 spUpdateinfo
@id=默认值,
@job=N'Loadsoftext',
@address=N'Loadsoftext',
@startdate=''2009-02-01 00:00:00:000'',
@enddate=''2009-05-15 00:00:00:000'',
@other=N'加载软文本'

我得到的是这个错误:

消息 102,第 15 级,状态 1,第 5 行
“2009”附近的语法不正确。

我正在做的是在 asp.net 代码隐藏中使用日期并将其作为参数作为普通日期传递,假设它在 SQL 过程中转换为 smalldatetime。使用的方法和变量以及字符串等可以与插入时完全相同,但由于某种原因,UPDATING 会导致问题。我在谷歌搜索时看到了一些 PreserveSingleQuotes() 函数,但在 vb 或 SQL Server 2005 中似乎不存在。

知道是什么原因造成的以及如何使更新正常工作吗?

编辑:哦,日期最初是芬兰语格式,即 dd.MM.yyyy。但如前所述,所有这些工作都很好,并且在使用 INSERT 时会自动转换。

编辑2:这是整个代码。

Asp.Net (vb)

        将 fdate 变暗为日期
        将日期变暗为日期

        fdate = CDate(BegindateTextBox.Text.Trim)
        ldate = CDate(EnddateTextBox.Text.Trim)
        将 ID 调暗为新 SqlParameter("@id", Request.QueryString("job_id"))
        将作业作为新的 SqlParameter("@job", JobTextBox.Text)
        将地址变暗为新 SqlParameter("@address", AddressTextBox.Text)
        Dim Begindate As New SqlParameter("@startdate", fdate)
        将结束日期调暗为新的 SqlParameter("@enddate", ldate)
        将 Otherinfo 作为新的 SqlParameter("@other", OtherinfoTextBox.Text)

        开始日期.DbType = DbType.Date
        结束日期.DbType = DbType.Date

        myCommand = 新 SqlCommand("spUpdateinfo")
        myCommand.CommandType = CommandType.StoredProcedure
        myCommand.Connection = conn
        myCommand.Parameters.Add(ID)
        myCommand.Parameters.Add(作业)
        myCommand.Parameters.Add(地址)
        myCommand.Parameters.Add(开始日期)
        myCommand.Parameters.Add(结束日期)
        myCommand.Parameters.Add(其他信息)

        myCommand.ExecuteNonQuery()

SQL 过程

    更新作业信息
    设置工作 = @Job,
        地址=@地址,
        Begindate = CAST(@Begindate AS smalldatetime),
        结束日期 = CAST(@Enddate AS smalldatetime),
        其他信息 = @Otherinfo
    哪里 Job_id = @id

花了一段时间,因为我不得不编辑敏感词。无论如何,谢谢帮助和任何想法发生了什么?你可以在那里看到演员表等,因为我试图摆弄我能修复的任何东西,但它仍然无法正常工作。

编辑3:感谢您的帮助,今天休息,所以明天我会继续看这个。

4

4 回答 4

3

尝试这个:

exec spUpdateinfo 
@id=default,
@job=N'Loadsoftext',
@address=N'Loadsoftext',
@startdate='2009-02-01 00:00:00:000',
@enddate='2009-05-15 00:00:00:000',
@other=N'Loadsoftext'

创建日期时间字符串时,您应该只需要一个撇号

编辑

Asp.Net (vb)

    Dim fdate As Date
    Dim ldate As Date

    fdate = CDate(BegindateTextBox.Text.Trim) 
    ldate = CDate(EnddateTextBox.Text.Trim) 
    //Trim might be screwing it up not sure

    Dim ID As New SqlParameter("@id", Request.QueryString("job_id"))
    Dim Job As New SqlParameter("@job", JobTextBox.Text)
    Dim Address As New SqlParameter("@address", AddressTextBox.Text)
    Dim Begindate As New SqlParameter("@startdate", fdate)
    Dim Enddate As New SqlParameter("@enddate", ldate)
    Dim Otherinfo As New SqlParameter("@other", OtherinfoTextBox.Text)

    Begindate.DbType = DbType.Date // Try removing this
    Enddate.DbType = DbType.Date // Try removing this

    myCommand = New SqlCommand("spUpdateinfo")
    myCommand.CommandType = CommandType.StoredProcedure
    myCommand.Connection = conn
    myCommand.Parameters.Add(ID)
    myCommand.Parameters.Add(Job)
    myCommand.Parameters.Add(Address)
    myCommand.Parameters.Add(Begindate)
    myCommand.Parameters.Add(Enddate)
    myCommand.Parameters.Add(Otherinfo)

    myCommand.ExecuteNonQuery()

SQL 过程

UPDATE jobInfo
SET Job = @Job,
    Address= @Address,
    Begindate = CAST(@Begindate AS smalldatetime) //Try removing the cast,
    Enddate = CAST(@Enddate AS smalldatetime) //Try removing the cast,
    Otherinfo = @Otherinfo
WHERE Job_id = @id

这很奇怪,因为您正在做的事情与我经常做的事情非常相似,而且我没有遇到您遇到的问题。我唯一能建议的是删除我突出显示的部分,看看它是否有效。我建议这样做是因为在我通常使用的代码中,它们不是必需的。

于 2009-05-14T13:46:59.753 回答
2

您如何从 ASP.NET 调用您的存储过程?您是否使用 SqlCommand 对象并通过 Parameters 集合将参数添加到命令中?

通常,您不会使用 Text 命令,但也将类型设置为 StoredProcedure。以下示例使用 5 个参数调用名为“tblAccount_Save”的存储过程:

    Dim conn As New SqlConnection("server=myserver;integrated security=sspi;initial catalog=mydb;")
    Dim sql As String = "[dbo].[tblAccount_Save]"
    Dim comm As System.Data.SqlClient.SqlCommand = New SqlCommand(sql, conn)
    comm.CommandType = System.Data.CommandType.StoredProcedure
    comm.Parameters.AddWithValue("@ID", id)
    comm.Parameters.AddWithValue("@AccountNumber", number)
    comm.Parameters.AddWithValue("@ClassID", class)
    comm.Parameters.AddWithValue("@LastName", lastName)
    comm.Parameters.AddWithValue("@FirstName", firstName)
    comm.ExecuteNonQuery()

请提供有关如何从代码隐藏调用存储过程的更多信息。

谢谢。

于 2009-05-14T13:50:34.753 回答
1

编辑4:好的,让它工作。感谢您的帮助并为麻烦感到抱歉,因为该缺陷从未出现在日期中。@id=default 应该是一个提示。我在链接到编辑页面的部分有错字,我将“job_id”设置为“jb_id”,因此实际数字从未返回。我不敢相信我错过了这个并在这上面花了几个小时......

哦,好吧,如前所述,感谢您的帮助。:D

于 2009-05-15T09:22:27.870 回答
1

我认为它是双引号的事情。探查器可能看起来像它,因为它在一个主 sp_executesql 语句中显示它并且它转义了单引号。但是,您拥有的语句应该是单引号而不是双引号。

于 2009-05-14T13:49:54.163 回答