如何从数据库访问特定的数据字段

时间:2014-01-12 14:54:02

标签: c# mysql .net database

我正在开发一个库存软件,我希望通过与ProductCode进行比较来访问ProductName和产品价格,我已经存储在名为ProductLog的数据库表中的数据,产品日志中的数据是:

ItemNO       Productode       ProductName      ProductPrice
     1             123              lux              58
     2             321              soap             68

现在我希望我只在名为txtProductCode的教科书中输入productCode,然后按Tab键,然后自动填充ProductPrice(txtProductPrice)和ProductName(txtProductName)框。

我尝试比较Productcode和访问值的代码是:

  private void txtProdcutCode_Leave(object sender, EventArgs e)
        {
            ///////////////////////////////////////////////////////////////////////

            InitializeComponent();
            string sql;

            int productCode = 0;

            productCode = Convert.ToInt32(txtProdcutCode.Text);

            sql = "";
        sql = "SELECT dbo.ProductLog.ProductName, dbo.ProductLog.ProductName";
        sql = " WHERE ProductLog.ProductCode = " + txtProdcutCode.Text + "";


            SqlConnection cn = new SqlConnection();
            SqlCommand rs = new SqlCommand();
            SqlDataReader sdr = null;
            clsConnection clsCon = new clsConnection();


            clsCon.fnc_ConnectToDB(ref cn);


            rs.Connection = cn;
            rs.CommandText = sql;
            sdr = rs.ExecuteReader();


            while (sdr.Read())
            {

                txtProductPrice.Text = sdr["ProductPrice"].ToString();
                txtProductName.Text = sdr["ProductName"].ToString();
            }


            //lblTotalQuestion.Text = intQNo.ToString();

            sdr.Close();
            rs = null;
            cn.Close();




            /////////////////////////////////////////////////////////////////////////         
        }

但在productCode = Convert.ToInt32(txtProdcutCode.Text);行中,它显示Input string was not in a correct format.

请帮我解决这个问题。

编辑:

我也试过这段代码:

   private void txtProdcutCode_Leave(object sender, EventArgs e)
        {
            ///////////////////////////////////////////////////////////////////////

            string sql;

          //  int productCode = 0;

            //productCode = Convert.ToInt32(txtProdcutCode.Text);

            sql = "";
            sql = "SELECT dbo.ProductLog.ProductName, AND dbo.ProductLog.ProductName";
            sql = " WHERE dbo.ProductLog.ProductCode = " + txtProdcutCode.Text + "";


            SqlConnection cn = new SqlConnection();
            SqlCommand rs = new SqlCommand();
            SqlDataReader sdr = null;
            clsConnection clsCon = new clsConnection();


            clsCon.fnc_ConnectToDB(ref cn);


            rs.Connection = cn;
            rs.CommandText = sql;
            sdr = rs.ExecuteReader();


            while (sdr.Read())
            {

                txtProductPrice.Text = sdr["ProductPrice"].ToString();
                txtProductName.Text = sdr["ProductName"].ToString();
            }


            //lblTotalQuestion.Text = intQNo.ToString();

            sdr.Close();
            rs = null;
            cn.Close();




            /////////////////////////////////////////////////////////////////////////         
        }

但它说Incorrect syntax near the keyword 'WHERE'.表示我在查询中调用数据库表时出错,但我无法找出错误......

2 个答案:

答案 0 :(得分:2)

您的SQL存在一些问题。

  1. 您最初覆盖了sql变量,最后只有一个WHERE子句;
  2. 您没有FROM语句,因此数据库不知道您尝试从哪里检索记录。
  3. 在SELECT语句中使用AND是不正确的;你只需要用逗号分隔字段。
  4. 您永远不会从数据库中选择ProductPrice,而是选择ProductName两次!
  5. 您没有为查询使用参数化SQL,而是让您的应用程序对SQL注入攻击开放。
  6. 为了解决这个问题(第1-4点,我将为你自己的研究留下第5点),

      sql = "";
      sql = "SELECT dbo.ProductLog.ProductName, AND dbo.ProductLog.ProductName";
      sql = " WHERE dbo.ProductLog.ProductCode = " + txtProdcutCode.Text + "";
    

    应该是

      sql += "SELECT ProductName, ProductPrice";
      sql += "  FROM dbo.ProductLog";
      sql += " WHERE ProductCode = '" + txtProdcutCode.Text + "'";
    

    注意:这个答案假定txtProductCode.Text的值是一个整数!

      

    编辑:事实证明,ProductCode列是一个VarChar。对于OP   当你得到SQL转换错误时,和其他人阅读这个问题   检查SQL Server中的列数据类型,并确保它与之匹配   你提交了。

    这是基础知识。还有许多其他改进可以做,但这会让你前进。了解基本的SQL语法,一旦解决了这个问题,请考虑使此查询使用参数,而不是直接将txtProductCode.Text放入查询中。祝你好运!

答案 1 :(得分:1)

永远不要再调用InitializeComponent方法两次。它正在创建表单和控件,并且它在表单的构造函数中调用。可能当你离开textBox时它再次创建而textBox将是空白的。因此你得到了错误。从代码中删除InitializeComponent,然后重试。

更新:您的命令文本错误。您应该使用+=

sql += " WHERE dbo.ProductLog.ProductCode = " + txtProdcutCode.Text + "";

但这不是优雅和安全的。而是使用paramatirezed queries这样:

SqlCommand cmd = new SqlCommand();
cmd.Connection =  cn;
cmd.CommandText = "SELECT dbo.ProductLog.ProductName,dbo.ProductLog.ProductName WHERE dbo.ProductLog.ProductCode = @pCode";
cmd.Parameters.AddWithValue("@pCode", txtProdcutCode.Text );