C# 本地主机数据库的SqlCommand连接字符串

C# 本地主机数据库的SqlCommand连接字符串,c#,sql,database-connection,connection-string,C#,Sql,Database Connection,Connection String,我正在尝试在VS Express for Web 2013中创建一个简单的网站,该网站可以与数据库“Parts”交互。我的数据库存储在app_数据文件夹中。我可以在服务器资源管理器中查看连接,这意味着连接字符串已保存。但是,以下代码会引发2个错误: 错误13“System.Data.SqlClient.SqlCommand.SqlCommand(string,System.Data.SqlClient.SqlConnection)”的最佳重载方法匹配具有一些无效参数 错误14参数2:无法从“字符

我正在尝试在VS Express for Web 2013中创建一个简单的网站,该网站可以与数据库“Parts”交互。我的数据库存储在app_数据文件夹中。我可以在服务器资源管理器中查看连接,这意味着连接字符串已保存。但是,以下代码会引发2个错误:

  • 错误13“System.Data.SqlClient.SqlCommand.SqlCommand(string,System.Data.SqlClient.SqlConnection)”的最佳重载方法匹配具有一些无效参数
  • 错误14参数2:无法从“字符串”转换为“System.Data.SqlClient.SqlConnection”
  • 我不知道如何补救。这是我的c#代码:

    我对c#一无所知,所以请记住这一点。谢谢你的帮助

    更新:以下代码引发两个错误,这两个错误都是:

    Error   15  The name 'conn' does not exist in the current context
    
    我是c#新手,但代码似乎没有任何问题。“conn”的名称在上面有明确的定义

    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class _Default : System.Web.UI.Page
    {
    
        protected void insertButton_Click(object sender, EventArgs e)
        {
            using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString))
            using (var cmd = new SqlCommand(
                "INSERT INTO PARTS VALUES(@name, @description, @quantity, @category)", conn))
            {
                cmd.Parameters.AddWithValue("name", nameBox.Text);
                cmd.Parameters.AddWithValue("description", descriptionBox.Text);
                cmd.Parameters.AddWithValue("quantity", quantityBox.Text);
                cmd.Parameters.AddWithValue("category", categoryList.SelectedValue);
                conn.Open();
                cmd.ExecuteNonQuery();
            }
    
    
        }
    }
    

    配置中的连接值是多少

    你能试试吗

    SqlConnection conn = new SqlConnection(connstring);
    conn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;
    
    现在发出查询

    using(var conn = new SqlConnection(connectionString))
    {
        conn.Open();
        // use conn to create the command
    }
    
    但重要的是:您的SQL非常危险。这对SQL注入是开放的,SQL注入是一个巨大而简单的攻击面。请将其参数化

    例如:

    using(var conn = new SqlConnection(connectionString))
    using(var cmd = new SqlCommand(
        "INSERT INTO PARTS VALUES(@name, @description, ...)", conn))
    {
        cmd.Parameters.AddWithValue("name", nameBox.Text);
        cmd.Parameters.AddWithValue("description", descriptionBox.Text);
        //...
        conn.Open();
        cmd.ExecuteNonQuery();
    }
    

    (注意,您需要自己添加一些;我没有完整地添加,仅使用了
    name
    description

    您需要首先创建
    SqlConnection

    string connstring =     System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
    SqlConnection conn = new SqlConnection(connstring);
    SqlCommand cmd = new SqlCommand("INSERT INTO PARTS VALUES('" + nameBox.Text + "', '" + descriptionBox.Text + "', '" + quantityBox.Text + "', '" + categoryList.SelectedValue + "')"
                                   , conn);
    cmd.ExecuteNonQuery();
    
    要养成的一些早期习惯:

    • 不要连接SQL字符串。这有几个原因,尤其是SQL注入攻击的脆弱性
    • 使用语句将连接和命令包装在
      中。这样可以确保在出现异常时正确关闭连接
    最终结果将类似于:

    string connstring = ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
    using(SqlConnection conn = new SqlConnection(connstring))
    {
        string sql = "INSERT INTO PARTS VALUES(@name, @description, @quantity, @categoryList)"
        using(SqlCommand cmd = new SqlCommand(sql , conn))
        {
            cmd.Parameters.AddWithValue("@name", nameBox.Text);
            ... etc.
    
            cmd.ExecuteNonQuery();
        }
    }
    

    关于参数化查询如何帮助回答此问题的说明,因为OP对sql注入是开放的。此方法不会引发任何异常,但是,它也不会向我的表中插入新值。还有什么我需要看的吗?你在用什么数据库?如果使用本地数据库,则在构建时是否会复制或重建该数据库?它是本地数据库。弹出一个小框(我第一次没有注意到),上面写着“NullReferenceException未由用户代码处理”。突出显示的行是“string connstring=System.Configuration.ConfigurationManager.ConnectionString[“connect”].ConnectionString;”听起来你的连接字符串不在app.config文件中(或者由于某种原因没有键
    “connect”
    ,当我使用您的代码时,会发生这样的情况:“错误16当前上下文中不存在“conn.Open()”@Johnny_Rose您是否意外添加了
    {}
    在第一个
    using
    语句之后?不,更新的代码已发布。我可能刚做了一些愚蠢的事情,但鉴于我缺乏c#专业知识,很难说清楚。@Johnny您在第一个using语句(最右侧)中添加了一个分号。将其删除。啊,谢谢!现在我得到以下例外情况:“应用程序“/”中的服务器错误。对象引用未设置为对象的实例。异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。”错误位于此行的某个位置(或者,此行突出显示):“第14行:使用(var conn=new SqlConnection(System.Configuration.ConfigurationManager.ConnectionString[“connect”].ConnectionString))“
    string connstring = ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
    using(SqlConnection conn = new SqlConnection(connstring))
    {
        string sql = "INSERT INTO PARTS VALUES(@name, @description, @quantity, @categoryList)"
        using(SqlCommand cmd = new SqlCommand(sql , conn))
        {
            cmd.Parameters.AddWithValue("@name", nameBox.Text);
            ... etc.
    
            cmd.ExecuteNonQuery();
        }
    }