2

JavaScriptで変数に値を格納しています。コードビハインドから変数にアクセスしてデータベースに保存するために、隠しタグを作成しました。しかし、何らかの理由で、 cmd.ExecuteNonQuery();データベースにデータを入力しようとすると、次のエラーが表示されます。

ERROR: 42601: syntax error at end of input

以下は、asp の入力タグです。

    <div>
        <input id="hidden_value" type="hidden" runat="server"/>
         <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

    </div>

以下は、javascript で非表示の入力を呼び出して値に設定する方法です。

var store_altitude;
store_altitude = some_value;
document.getElementById("hidden_value").value=store_altitude;

コードビハインドは次のとおりです。

 using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
            {
                try
                {
                    conn.Open();
                    Response.Write(hidden_value.Value);
                    NpgsqlCommand cmd = new NpgsqlCommand("insert into altitude select nextval('altitude_id_seq'),"+hidden_value.Value, conn);
                    cmd.ExecuteNonQuery();


                    conn.Close();
                }
                catch (Exception)
                {
                    ClientScript.RegisterStartupScript(this.GetType(), "", "$(document).ready(function(){alert('problem with connection')});", true);
                }
            }
4

2 に答える 2

1

パラメータと文字列を連結してSQLを構築することは絶対にしないでください。これは遅く、エラーが発生しやすく、SQL インジェクションにさらされています。あなたの場合、ウェブ ハッカーならだれでもあなたのデータベースへのフル アクセスを簡単に取得できるようです。

ORM を使用せずに生の SQL を記述しているため、残念ながら、ADO.NET の API がかなりひどいという事実に直面します。dapperのようなものを使用することを強くお勧めします。これにより、次のようにクエリを大まかに表現できます。

conn.Execute(@"
    insert into altitude
    values (extval('altitude_id_seq'), @hiddenVal)",
       new { hiddenVal = hidden_value.Value});

他にも軽量の ADO.NET ラッパーがあります。多くは問題なく、dapperはたまたまよく知られています。

マイナーな問題として、厳密には必須ではありませんが、DB にリストされている順序で暗黙的に使用するよりも、挿入する列名を含める方が読みやすいことがわかりました。ただし、スキーマが変更されないことが確実である場合は、問題はありません。

于 2013-02-22T10:32:02.357 に答える
0

runat="server" を hidden_​​value から、コード側の user request["hidden_​​value"]; から削除できます。hidden_​​value の値を取得します。

于 2013-02-22T10:29:01.477 に答える