【问题标题】:Dropdown insert issue下拉插入问题
【发布时间】:2015-11-08 21:37:02
【问题描述】:

我正在为我的最终项目创建一个网络表单。我正在开发一个非常基本的幻想联盟。

我有一个页面让用户从下拉列表中为每个位置选择 11 名球员,然后将他们插入数据库。当我点击页面底部的提交时,它应该将每个下拉列表中的文本插入到数据库中。

现在,当我尝试将下拉菜单的文本插入数据库时​​,它会显示以下错误:

列名“Courtois”无效。

然而,Courtois 是来自守门员下拉菜单的文本。

protected void btnConfirm_Click(object sender, EventArgs e)
{

   string query = "INSERT into userPicks (Name) values ("+ ddlKeeper.Text + ")";
   SqlConnection conn = new SqlConnection(cs);

   SqlCommand cmd = new SqlCommand(query, conn);
   conn.Open();
   int rowsInserted = cmd.ExecuteNonQuery();

   if (rowsInserted > 0)
   {
      Response.Write("Data inserted successfully");
   }
   else
   {
      Response.Write("Data was not inserted into database");
   }
}

if 语句只是为了测试数据是否被插入。

我已经尝试对需要插入的值进行硬编码,并且效果很好。

我认为我尝试将数据插入数据库可能是错误的语法或错误的方式。

这是我从一个单独的数据库中调出玩家姓名的代码:

protected void Page_Load(object sender, EventArgs e)
{
   DataSet gk = new DataSet();

   SqlConnection conn = new SqlConnection(cs);
   conn.Open();

   SqlCommand cmdgk = new SqlCommand("Select name FROM Players WHERE position='gk'", conn);

   SqlDataAdapter adpgk = new SqlDataAdapter(cmdgk);

   adpgk.Fill(gk);
   ddlKeeper.DataSource=gk;
   ddlKeeper.DataValueField = "Name";
   ddlKeeper.DataBind();

}

【问题讨论】:

    标签: c# mysql database connection-string sqlexception


    【解决方案1】:

    试试这个 -

    string query = "INSERT into userPicks (Name) values ('"+ ddlGK.Text + "')";
    

    更好的方法是使用参数化查询。搜索参数化查询,您应该会找到大量示例。

    【讨论】:

    • 太棒了!这就是问题所在。非常感谢!
    【解决方案2】:

    在 sql 查询中使用时,字符串值应该用单引号引起来。然而,执行插入查询的正确方法是使用像这样的参数化查询

    protected void btnConfirm_Click(object sender, EventArgs e)
    {
    
       string query = "INSERT into userPicks (Name) values (@name)";
       using (SqlConnection conn = new SqlConnection(cs))
       using (SqlCommand cmd = new SqlCommand(query, conn))
       {
           conn.Open();
           cmd.Parameters.Add("@name", SqlDbType.NVarWChar).Value = ddlGK.Text; 
           int rowsInserted = cmd.ExecuteNonQuery();
           if (rowsInserted > 0)
           {
                Response.Write("Data inserted successfully");
           }
           else
           {
                Response.Write("Data was not inserted into database");
           }
        }
    }
    

    参数化查询始终是正确的方法。如果您的输入包含单引号(而不是字符串连接,您的查询将因语法错误而失败),您不必担心,但最重要的是您的代码将不受 Sql Injection hacks 的影响

    顺便说一句,您使用 MySql 标记您的问题,但您的代码使用适用于 Sql Server 的 SqlClient 类。

    【讨论】:

    • 感谢您的解释。也会尝试这种方式。
    • 请不要在公共网站上使用字符串连接。你迟早会后悔的。
    • 好的,我照你说的做了,但现在的问题是它一直将默认下拉值插入数据库。无论我从下拉列表中选择什么,它都会在其中插入默认值。我在这里做错了什么?
    • 您似乎没有使用 IsPostBack 保护 Page_Load 代码免于重新进入。
    • 另外,“SqlDbType.NVarWChar”是什么意思?
    猜你喜欢
    • 2017-04-12
    • 2014-07-23
    • 2014-05-28
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多