C# 我不知道';I don’我不理解我两次赋值同一个变量背后的逻辑

C# 我不知道';I don’我不理解我两次赋值同一个变量背后的逻辑,c#,.net,ado.net,C#,.net,Ado.net,我第一次在这个网站上问问题。 我在Visual C#2008中创建了一个简单的windows窗体,并将两个文本框中的值添加到access 2010数据库的两个字段中。数据库名为TestDatabase.accdb,表名为TestTable。两个变量FirstName和Address被分配给txt.FirstName和txt.Address的textbox.text值。在我看来,我还在为OleDBCommand类添加参数的语句中向这两个变量添加值: myCommand.Parameters.Add

我第一次在这个网站上问问题。 我在Visual C#2008中创建了一个简单的windows窗体,并将两个文本框中的值添加到access 2010数据库的两个字段中。数据库名为TestDatabase.accdb,表名为TestTable。两个变量FirstName和Address被分配给txt.FirstName和txt.Address的textbox.text值。在我看来,我还在为OleDBCommand类添加参数的语句中向这两个变量添加值:

myCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = txtName.Text;
所以基本上它是工作的,但我不理解逻辑,因为它看起来好像我不需要使用

FirstName = txtName.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;
            }
        }
    }
}

您的sql文本中有一个错误

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

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

除非有其他代码将全局变量Address和FirstName用作外部代码可用的表单属性,否则实际上不需要全局变量Address和FirstName-

您的sql文本中有错误

string strSQL = "INSERT INTO TestTable(Name1, Address) VALUES(@FirstName, '@Address')";
// 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);
你应该写

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

除非有其他代码将全局变量Address和FirstName用作外部代码可用的表单属性,否则实际上并不需要全局变量Address和FirstName-

我想他想知道为什么他改变了填充私有变量的方法而根本不使用它们

// 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);
myCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = FirstName;
myCommand.Parameters.Add("@Address", OleDbType.VarChar).Value = Address;

利用它们,这样你就可以设置它们,操纵它们,等等。

我想他想知道为什么他改变了方法来填充私有变量而根本不使用它们

myCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = FirstName;
myCommand.Parameters.Add("@Address", OleDbType.VarChar).Value = Address;
利用它们,因此您可以设置它们、操纵它们等等。

欢迎使用它们,凯文

只是澄清一下,您在这里并没有设置两次值

    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();
        }
    }
在上面的代码中,您正在将值重新分配给参数,或者换句话说,将值参数化。这是一个很好的使用和理解方法,因为它可以帮助保护您免受攻击。

欢迎使用SO,Kevin

只是澄清一下,您在这里并没有设置两次值

    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();
        }
    }

在上面的代码中,您正在将值重新分配给参数,或者换句话说,将值参数化。这是一个很好的使用和理解方法,因为它可以帮助保护您免受攻击。

Kevin更改这两行myCommand.Parameters.Add(“@FirstName”,OleDbType.VarChar)。Value=txtName.Text;myCommand.Parameters.Add(“@Address”,OleDbType.VarChar).Value=txtAddress.Text;到下面的
myCommand.Parameters.AddWithValue(“@FirstName”,txtName.Text);myCommand.Parameters.AddWithValue(“@Address”,txtAddress.Text)
首先
您的Insert语句也不正确
我建议将私有名称和地址更改为自动属性。然后将txtName.Text的值分配给name属性,并将txtdAddress的值分配给Address属性,然后将该属性传递给Insert命令。.同时更改
catch(Exception){MessageBox.Show(“出错”);}
您需要捕获实际的异常,执行如下操作
catch(exception ex){MessageBox.Show(ex.message);}
Kevin更改这两行myCommand.Parameters.Add(“@FirstName”,OleDbType.VarChar)。Value=txtName.Text;myCommand.Parameters.Add(“@Address”,OleDbType.VarChar).Value=txtAddress.Text;到下面的
myCommand.Parameters.AddWithValue(“@FirstName”,txtName.Text);myCommand.Parameters.AddWithValue(“@Address”,txtAddress.Text)
首先
您的Insert语句也不正确
我建议将私有名称和地址更改为自动属性。然后将txtName.Text的值分配给name属性,并将txtdAddress的值分配给Address属性,然后将该属性传递给Insert命令。.同时更改
catch(Exception){MessageBox.Show(“出错”);}
您需要捕获实际异常执行类似以下操作
catch(exception ex){MessageBox.Show(ex.message);}
谢谢..这也导致了一个小问题。您讨论了几个警告。你能说得更具体些吗?错误信息和你从哪里得到的我是说。谢谢。这也引起了一个小问题。你说了几个警告。你能说得更具体些吗?错误信息,你从哪里得到的,我是说。