2

私は、当社の Web マッピング アプリケーション イントラネットを開発しています。マップ上に「ポリゴンを追加」機能を作成しています。AspMap、VB.NET、および SQL Server を使用しています。ユーザーがボタンをクリックして Web フォームの入力データ属性から新しいレコードを追加すると、「?」の近くに構文が正しくありませんというエラーが表示されます。発生します。

私のコードは次のとおりです。

Private Sub AddNewShape(ByVal checklist_id As String, ByVal type As String, ByVal shape As AspMap.Shape, ByVal address_area As String, ByVal dmz As String, ByVal customerid As String, ByVal source As String, ByVal area As String, ByVal instalatur As String, ByVal developer As String, ByVal data_received As DateTime, ByVal doc_data As DateTime, ByVal datereport As DateTime, ByVal remark As String)
    Dim tableName As String

    Select Case shape.ShapeType
        Case AspMap.ShapeType.Line
            tableName = "lines"
        Case AspMap.ShapeType.Polygon
            tableName = "sambungan_baru"
        Case Else
            Return
    End Select

    Dim conn As SqlConnection = GetDbConnection()
    Dim sql As String = "INSERT INTO " & tableName & " (CHECKLIST_ID, TYPE, SHAPEDATA, ADDRESS_AREA, DMZ, CUSTOMERID, SOURCE, AREA, INSTALATUR, DEVELOPER, DATA_RECEIVED, DOC_DATA, DATA_SENT, REMARK) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"

    Dim cmd As SqlCommand = New SqlCommand(sql, conn)
    cmd.Parameters.AddWithValue("CHECKLIST_ID", checklist_id)
    cmd.Parameters.AddWithValue("TYPE", type)
    cmd.Parameters.AddWithValue("SHAPEDATA", shape.ShapeData)
    cmd.Parameters.AddWithValue("ADDRESS_AREA", address_area)
    cmd.Parameters.AddWithValue("DMZ", dmz)
    cmd.Parameters.AddWithValue("CUSTOMERID", customerid)
    cmd.Parameters.AddWithValue("SOURCE", source)
    cmd.Parameters.AddWithValue("AREA", area)
    cmd.Parameters.AddWithValue("INSTALATUR", instalatur)
    cmd.Parameters.AddWithValue("DEVELOPER", developer)
    cmd.Parameters.AddWithValue("DATA_RECEIVED", data_received)
    cmd.Parameters.AddWithValue("DOC_DATA", doc_data)
    cmd.Parameters.AddWithValue("DATA_SENT", datereport)
    cmd.Parameters.AddWithValue("REMARK", remark)

    cmd.ExecuteNonQuery()
    conn.Close()

    ReloadShapesDatabase()
End Sub

私はこれを変更しました:

Dim sql As String = "INSERT INTO " & tableName & " (CHECKLIST_ID, TYPE, SHAPEDATA, ADDRESS_AREA, DMZ, CUSTOMERID, SOURCE, AREA, INSTALATUR, DEVELOPER, DATA_RECEIVED, DOC_DATA, DATA_SENT, REMARK) VALUES *(?,?,?,?,?,?,?,?,?,?,?,?,?,?)

これに:

Dim sql As String = "INSERT INTO " & tableName & " (CHECKLIST_ID, TYPE, SHAPEDATA, ADDRESS_AREA, MZ, CUSTOMERID, SOURCE, AREA, INSTALATUR, DEVELOPER, DATA_RECEIVED, DOC_DATA, DATA_SENT, REMARK)(@checklist_id, @type, @shapedata, @address_area, @dmz, @conection, @source, @area, @instalatur, @developer, @data_received, @doc_data, data_sent, @remark)"

そして、アラートに出くわしました:スカラー変数 "@conection" を宣言する必要があります。誰でも私を助けることができますか?

4

3 に答える 3

4

SQL クエリで 2 つの異なるスタイルのパラメーターを混同しています。ODBC 構文は、単純なプレースホルダー「?」を使用します。パラメータは、パラメータ コレクションに追加した順序で置き換えられます。の場合OdbcCommand、パラメータに付けた名前は無視され、その順序のみが重要になります。

の場合SqlCommand、パラメーター名は意味があります。コマンドが実行されると、パラメーター名と値のリストを受け取り、それらを T-SQL クエリに代入する SQL ストアド プロシージャを通じて実行されます。この場合、クエリにパラメーターを追加する順序は重要ではありませんが、名前が正しいことを確認する必要があります ("@" プレフィックスを含む)。

パラメータでa を使用する適切な方法SqlCommandは次のとおりです。

// The SQL Query: Note the use of named parameters of the form
// @ParameterName1, @ParameterName2, etc.
Dim sql As String = "INSERT INTO " & tableName & _
"    (CHECKLIST_ID, TYPE, SHAPEDATA ) " & _
"VALUES " & _
"    (@ChecklistId, @Type, @ShapeData )"

// The Parameter List. Note that the Parameter name must exactly match
// what you use in the query:
Dim cmd As SqlCommand = New SqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@CheckListId", checklist_id)
cmd.Parameters.AddWithValue("@Type", type)
cmd.Parameters.AddWithValue("@ShapeData", shape.ShapeData)

cmd.ExecuteNonQuery()
于 2012-06-13T03:10:41.217 に答える
1

このようなパラメーターを割り当てる必要があります。この場合、「CONECTION」パラメーターの値を指定できませんでした。また、追加の注意として、常に接続オブジェクトを using ブロックで囲む必要があります。これを見て「備考」欄を見てください。

command.CommandText = "INSERT INTO Table (Col1, Col2, Col3) VALUES _
                     (@Col1Val, @Col2Val, @Col3Val)"
command.Parameters.AddWithValue("@Col1Val","1");
command.Parameters.AddWithValue("@Col2Val","2");
command.Parameters.AddWithValue("@Col3Val","3");
于 2012-06-13T02:50:00.360 に答える
0

がオープン接続でDim cmd As SqlCommand = New SqlCommand(sql, conn)使用されていることを確認してください。conn

次に、パラメーターの型がデータベース テーブルの定義に従っていることを確認します。さらに、文字列型を使用している場合は、挿入されたテキストの前後に ' を追加できます。

確かに、cmd.ExecuteNonQuery()関連付けられて実行されているコマンドの値を中断して、任意の SQL マネージャー ツールにコピーできます。

最後に、あなたのを処分しますcmd

それ以外の場合は、これが問題に役立つかどうかを確認してください: http://social.msdn.microsoft.com/Forums/en-US/sqlspatial/thread/9d75106a-b0d4-49cc-ac86-d41cba4ab797

于 2012-06-13T14:14:00.983 に答える