0

このサイトで初めて質問をしました。Visual C#2008で作成された単純なWindowsフォームがあり、2つのテキストボックスの値をAccess2010データベースの2つのフィールドに追加しています。データベースはTestDatabase.accdbと呼ばれ、テーブルはTestTableです。FirstNameとAddressの2つの変数が、txt.FirstNameとtxt.Addressのtextbox.text値に割り当てられます。OleDBCommandクラスのパラメーターを追加するためのステートメントで、これら2つの変数にも値を追加しているようです。

myCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = txtName.Text;

基本的には動作していますが、使用する必要がないように見えるため、ロジックがわかりません。

FirstName = txtName.Text;

また

Address = txtAddress.Text;

ステートメント。TextChangedイベントからコードを削除すると、いくつかの警告が表示されます。

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

namespace Test
{
    public partial class Form1 : Form
    {
        private string FirstName;
        private  string Address;

        private void cmdAdd_Click(object sender, EventArgs e)
        {
            string strSQL = "INSERT INTO TestTable(Name1, Address) VALUES(@FirstName, '@Address')";
            // represents an open connection to a data source.  Is a class
            OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\TEMP\\TestDatabase.accdb");
            // represents an SQL statement or stored procedure to execute against a data source
            //( takes care of passing queries to the database).  Is a class.
            OleDbCommand myCommand = new OleDbCommand(strSQL, myConnection);
            myCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = txtName.Text;
            myCommand.Parameters.Add("@Address", OleDbType.VarChar).Value = txtAddress.Text;

            try
            {
                myConnection.Open();
                myCommand.ExecuteNonQuery();
            }
            catch (Exception)
            {
                MessageBox.Show("Something went wrong");
            }
            finally
            {
                myConnection.Close();
            }
        }

        private void txtName_TextChanged(object sender, EventArgs e)
        {
            //IsNullOrEmpty indicates whether the string is null ot an Empty string
            //true if the value parameter is null or an empty string(""); otherwise, false
            if (string.IsNullOrEmpty(txtName.Text))
            {
                //has no value
            }
            else
            {
                FirstName = txtName.Text;
            }
        }

        private void txtAddress_TextChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtAddress.Text))
            {
                //has no value
            }
            else
            {
                Address = txtAddress.Text;
            }
        }
    }
}
4

4 に答える 4

3

SO、ケビンへようこそ!

明確にするために、ここでは値自体を2回設定しているわけではありません。

    private void txtName_TextChanged(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(txtName.Text))
        {
            //has no value
        }
        else
        {
            FirstName = txtName.Text;
        }
    }

    private void txtAddress_TextChanged(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(txtAddress.Text))
        {
            //has no value
        }
        else
        {
            Address = txtAddress.Text;
        }
    }

上記のコードで値を設定しています

    private void cmdAdd_Click(object sender, EventArgs e)
    {
        string strSQL = "INSERT INTO TestTable(Name1, Address) VALUES(@FirstName, @Address)";
        OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\TEMP\\TestDatabase.accdb");
        OleDbCommand myCommand = new OleDbCommand(strSQL, myConnection);
        myCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = txtName.Text;
        myCommand.Parameters.Add("@Address", OleDbType.VarChar).Value = txtAddress.Text;

        try
        {
            myConnection.Open();
            myCommand.ExecuteNonQuery();
        }
        catch (Exception)
        {
            MessageBox.Show("Something went wrong");
        }
        finally
        {
            myConnection.Close();
        }
    }

上記のコードでは、値をパラメーターに再割り当てしています。つまり、値をパラメーター化しています。これは、 SQLインジェクション攻撃からユーザーを保護するのに役立つため、使用して理解することをお勧めします。

于 2013-01-18T18:46:25.467 に答える
1

SQLテキストにエラーがあります

string strSQL = "INSERT INTO TestTable(Name1, Address) VALUES(@FirstName, '@Address')";

あなたは書くべきです

string strSQL = "INSERT INTO TestTable(Name1, Address) VALUES(@FirstName, @Address)";

グローバル変数AddressとFirstNameは、外部コードで使用可能なフォームプロパティとしてそれらを使用する他のコードがない限り、実際には必要ありません-

于 2013-01-18T18:41:07.360 に答える
1
// Trailing ' To Be Removed
String strSQL = "INSERT INTO TestTable(Name1, Address) VALUES(@FirstName, @Address)";

// Incorrect Parameters To Be Fixed
myCommand.Parameters.AddWithValue("@FirstName", txtName.Text);
myCommand.Parameters.AddWithValue("@Address", txtAddress.Text);
于 2013-01-18T18:42:55.003 に答える
1

プライベート変数をまったく使用せずに入力するTextChangedメソッドがあるのはなぜだろうと彼は思っていると思います。

myCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = FirstName;
myCommand.Parameters.Add("@Address", OleDbType.VarChar).Value = Address;

それらを利用するので、設定したり、操作したりすることができます。

于 2013-01-18T18:44:16.673 に答える