2

トピックが示唆するように。大量のデータを参照して処理できる小さなプログラムを作成しています。問題は、SQL テーブルへの新しい行の挿入は正常に機能しますが、同じメソッドを使用して更新すると、smalldatetime 変数で問題が発生することです。

プロファイラーを使用して、exec コマンドが日付に二重引用符を付けていることに気付きましたが、それを取り除くことができないようです。さらに、挿入時に同じ二重引用符が発生し、それは問題なく機能します。手順のコマンドは次のようになります。

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'Loadsoftext'

そして、私が得るのはこのエラーです:

メッセージ 102、レベル 15、状態 1、行 5
「2009」付近の構文が正しくありません。

私がやっていることは、asp.net コードビハインドで日付を使用し、それを通常の日付としてパラメータとして渡すことです。SQL プロシージャで smalldatetime に変換されると想定しています。使用するメソッドや変数、文字列などは挿入時とまったく同じで構いませんが、何らかの理由で UPDATING が問題を引き起こします。グーグルで PreserveSingleQuotes() 関数が使用されているのを見たことがありますが、vb または SQL Server 2005 には存在しないようです。

これを引き起こしている原因と、更新を正常に機能させる方法について何か考えはありますか?

編集:ああ、日付はもともとフィンランド語の形式で、dd.MM.yyyy です。しかし、前述のように、これはすべて正常に機能し、INSERT の使用中に自動的に変換されます。

編集 2:これがコード全体です。

Asp.Net (vb)

        薄暗い日付として日付
        薄暗い日付として日付

        fdate = CDate(BegindateTextBox.Text.Trim)
        ldate = CDate(EnddateTextBox.Text.Trim)
        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
        Enddate.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(Begindate)
        myCommand.Parameters.Add(終了日)
        myCommand.Parameters.Add(その他の情報)

        myCommand.ExecuteNonQuery()

SQL プロシージャー

    ジョブ情報を更新
    SET ジョブ = @ジョブ、
        アドレス= @アドレス、
        Begindate = CAST(@Begindate AS smalldatetime),
        Enddate = CAST(@Enddate AS smalldatetime),
        その他の情報 = @その他の情報
    WHERE 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'

日時文字列を作成するときは、アポストロフィが 1 つだけ必要です。

編集

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

二重引用符のことだと思います。プロファイラーは、1 つのメイン sp_executesql ステートメント内にそれを表示し、一重引用符をエスケープしているため、それを持っているように見える場合があります。ただし、そのままのステートメントは、二重引用符ではなく単一引用符にする必要があります。

于 2009-05-14T13:49:54.163 に答える
1

編集 4: OK、うまくいきました。欠陥が最初から日付にあったことはなかったので、助けてくれてありがとう、そしてトラブルをお詫びします。@id=default はヒントになるはずです。編集ページにリンクする部分にタイプミスがあり、「job_id」を「jb_id」に設定したため、実際の番号が返されませんでした。これを見逃して、これに何時間も費やしたなんて信じられない...

ああ、言ったように、助けてくれてありがとう。:D

于 2009-05-15T09:22:27.870 に答える