0

メールサーバーの設定とネットワーククレデンシャル情報を更新する非常に単純なUpdateステートメントがあります...Accessで実行するとクエリは正常に機能しますが、C#でSQL構文が間違っているというエラーが表示され続けます...データアクセスがありますレイヤー(dalクラス)と以下に貼り付けられたインスタンスメソッドの更新...しかし、問題は他の方法である必要があります。私はこの方法で多くのものを更新しましたが、今回は実行されません..手がかりがあれば大歓迎です。事前にThx。

DALクラスのインスタンスメソッドを更新します..(これはデータアクセス層であると想定されています:)私は管理職の卒業生です:P

public int UpdateRow(string Query, bool isSP, params OleDbParameter[] args)
{
    int affectedRows = -1;
    using (con = new OleDbConnection(connStr))
    {
        using (cmd = con.CreateCommand())
        {
            cmd.CommandText = Query;
            if (isSP)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (args != null)
            {
                foreach (OleDbParameter prm in args)
                {
                    cmd.Parameters.Add(prm);
                }
            }

            try
            {
            con.Open();
            affectedRows = cmd.ExecuteNonQuery();
            }
            catch(OleDbException ex)
            {
            throw ex;
            }
            catch (Exception ex)
            {
            throw ex;
            }
        }
    }
    return affectedRows;
}

そして、その背後にあるASP.NEtコードは更新を行います=

protected void Update_Click(object sender, EventArgs e) {
DAL dal = new DAL();
string upt = string.Format("UPDATE [MailConfig] SET Server='{0}', Username='{1}', Password='{2}', AddressFrom='{3}', DisplayName='{4}'",server.Text,username.Text,password.Text,replyto.Text,displayname.Text);
dal.UpdateRow(upt,false,null);
LoadData();
}

平和!

4

4 に答える 4

3

フィールド名を [ ] で囲んでいます。過去に、ユーザー名、パスワード、カウントなどの特定のフィールド名が予約語として認識され、SQL を台無しにしてエラーが発生するという問題がありました。

于 2008-12-16T13:32:51.887 に答える
0

まず最初に-ここでは使用しないstring.Formatでください。パラメーターを使用して、コマンドにパラメーターを追加します。現在、SQLインジェクション攻撃に対して広くオープンです。「ボビーテーブル」を考えてみてください。

「私のSQL構文が間違っていると述べている」-正確なエラーを引用していただけますか?

于 2008-12-16T13:13:49.820 に答える
0

まず、Updateにwhere句がないため、すべての行が更新され、キーの制約に違反してエラーが発生します(存在する場合)。

次に、この種のコードを実行すると、SQLインジェクションに対して非常に脆弱になります。誰かが、SQLコマンドが埋め込まれたユーザー名を入力すると、すべてのデータが失われる可能性があります。

パラメータ化されたクエリを使用する必要があります。{4}を使用する代わりに@paramnameを使用してsqlコマンドでパラメーターを指定してから、コマンドオブジェクトを使用してaccessCommand.parameters.AddWithValue( "@ paramname"、value)を実行します。

于 2008-12-16T13:14:35.373 に答える
0

StoredProcedure の CommandType を使用していますが、クエリはストアド プロシージャ名ではなく、where 句のない SQL クエリです。

UPDATE [MailConfig] 
SET Server='{0}', 
    Username='{1}', 
    Password='{2}', 
    AddressFrom='{3}', 
    DisplayName='{4}'"

そのため、コマンド タイプ行を削除するか、正しいコマンド タイプ CommandType.Text に変更し、影響を受ける行を指定する Where 句を追加する必要があります。

アクセスにはストアド プロシージャさえないと思うので、そのコマンド タイプを使用する必要はありません。

ストアド プロシージャを使用するコマンドの例は次のようになります。

string sqlCommString = "QCApp.dbo.ColumnSeek";
SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
metaDataComm.CommandType = CommandType.StoredProcedure;

そのタイプのコマンド文字列は、ストアド プロシージャの名前にすぎません。

于 2008-12-16T13:20:38.307 に答える