Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net中执行sql命令_C#_Sql_Asp.net - Fatal编程技术网

C# 在asp.net中执行sql命令

C# 在asp.net中执行sql命令,c#,sql,asp.net,C#,Sql,Asp.net,我在对数据库执行sql命令时遇到问题。该命令应将新用户添加到“用户”表中 但当我运行代码时,我会在以下位置出现此异常: 命令。ExecuteOnQuery() 说明:执行当前web请求期间发生未经处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:System.Data.OleDb.OLEDBEException:INSERT INTO语句中出现语法错误。 这是页面的代码-GetSignIn.cshtml: @{ string Uname = Requ

我在对数据库执行sql命令时遇到问题。该命令应将新用户添加到“用户”表中

但当我运行代码时,我会在以下位置出现此异常:

命令。ExecuteOnQuery()

说明:执行当前web请求期间发生未经处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

异常详细信息:System.Data.OleDb.OLEDBEException:INSERT INTO语句中出现语法错误。

这是页面的代码-GetSignIn.cshtml:

@{
    string Uname = Request["name"];
    string userName = Request["userName"];
    string pass = Request["passWord"];
    string pic = Request["pic"];
    string privacy = Request["privacy"];

    if(pic == null)
    {
        pic = "Shared/defaultPic.jpg";
    }

    System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection();
    connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Etay\Documents\Visual Studio 2012\WebSites\Josef\Shared\users.mdb";
    try
    {
        System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand();
        command.Connection = connection;
        connection.Open();
        command.CommandText = "INSERT INTO users (userName,passWord,Uname,pic) VALUES ('" + userName + "', '" + pass + "', '" + Uname + "', '" + pass + "', " + pic + ")";
        command.ExecuteNonQuery();
        Response.Redirect("../HtmlPage.html");
    }
    finally
    {
        connection.Close();
    }


}

我应该在代码中更改什么?为什么会这样?INSERT INTO中的语法错误在哪里?

您在“INTO”子句之后设置了4个字段,但是您正在传递5个参数:

“在用户(用户名、密码、Uname、pic)中插入值(“+userName+”、“+pass+”、“+Uname+”、“+pass+”、“+pic+”)”)


只需添加第五个字段,或从值部分中删除一个参数

您在“INTO”子句之后设置了4个字段,但是您要传递5个参数:

“在用户(用户名、密码、Uname、pic)中插入值(“+userName+”、“+pass+”、“+Uname+”、“+pass+”、“+pic+”)”)


只需添加第五个字段,或从值部分删除一个参数

请检查Insert语句,看起来您提供了两次密码值


INSERT语句中的查询值数和目标字段数应相同。

请检查INSERT语句,看起来您提供了两次密码值


INSERT语句中查询值和目标字段的数目应相同。

INSERT语句中的数字参数错误。为了清楚起见,为什么不使用
string.Format
来保持所有内容的一致性呢?(假设这些都是字符串类型)

但是,看起来您可能也希望包含第5个参数-只需扩展格式:

var rawSql = @"Insert INTO Users (userName,passWord,Uname,pic, privacy) VALUES ('{0}','{1}','{2}','{3}','{4}')";
command.CommandText = string.Format(rawSql, userName, pass, Uname, pic, privacy);
command.ExecuteNonQuery();

insert语句中的参数编号错误。为了清楚起见,为什么不使用
string.Format
来保持所有内容的一致性呢?(假设这些都是字符串类型)

但是,看起来您可能也希望包含第5个参数-只需扩展格式:

var rawSql = @"Insert INTO Users (userName,passWord,Uname,pic, privacy) VALUES ('{0}','{1}','{2}','{3}','{4}')";
command.CommandText = string.Format(rawSql, userName, pass, Uname, pic, privacy);
command.ExecuteNonQuery();
我应该在代码中更改什么

  • 更改参数(这也解决了
    pic
    值周围没有引号的问题)
  • 删除值中的第二个
    pass

    command.CommandText = "INSERT INTO users (userName,passWord,Uname,pic) VALUES (@userName, @pass, @Uname, @pic)";
    command.Parameters.Add("@userName").Value = userName;
    .. etc.
    
  • 不清楚if
    pic
    是什么类型-您正在传递字符串,但我可以;t告诉列存储文件路径,或者是否正在索引以序列化文件并将其存储在pinary字段中

    我应该在代码中更改什么

  • 更改参数(这也解决了
    pic
    值周围没有引号的问题)
  • 删除值中的第二个
    pass

    command.CommandText = "INSERT INTO users (userName,passWord,Uname,pic) VALUES (@userName, @pass, @Uname, @pic)";
    command.Parameters.Add("@userName").Value = userName;
    .. etc.
    

  • 不清楚if
    pic
    是什么类型-您正在传递字符串,但我可以;t告诉列存储文件路径,或者是否正在索引以序列化文件并将其存储在pinary字段中。

    使用参数化查询。这是你的陈述改写,以利用它们。 我用using块替换了try/finally,尽管try/finally是可以接受的

    参数化查询可以防止错误和错误。如果我将勾号作为用户名或密码的一部分提交,则现有代码中可能会出现错误。在当前表单中,这将导致异常。这是因为勾号字符用于在sql语法中引用字符串

    using (System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection())
    {
        connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Etay\Documents\Visual Studio 2012\WebSites\Josef\Shared\users.mdb";
        using (System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand())
        {
            command.Connection = connection;
            command.CommandText = "INSERT INTO users (userName,passWord,Uname,pic) VALUES (?,?,?,?)";
            command.Parameters.Add(userName);
            command.Parameters.Add(pass);
            command.Parameters.Add(Uname);
            command.Parameters.Add(pic);
    
            connection.Open();
            command.ExecuteNonQuery();
        }
    }
    

    关于来自的OleDb连接的参数

    评论 当CommandType设置为Text时,OLE DB.NET提供程序不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。例如:

    SELECT * FROM Customers WHERE CustomerID = ?
    
    因此,OLEDBPParameter对象添加到OLEDBPParameterCollection的顺序必须直接对应于命令文本中参数的问号占位符的位置


    使用参数化查询。这是你的陈述改写,以利用它们。 我用using块替换了try/finally,尽管try/finally是可以接受的

    参数化查询可以防止错误和错误。如果我将勾号作为用户名或密码的一部分提交,则现有代码中可能会出现错误。在当前表单中,这将导致异常。这是因为勾号字符用于在sql语法中引用字符串

    using (System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection())
    {
        connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Etay\Documents\Visual Studio 2012\WebSites\Josef\Shared\users.mdb";
        using (System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand())
        {
            command.Connection = connection;
            command.CommandText = "INSERT INTO users (userName,passWord,Uname,pic) VALUES (?,?,?,?)";
            command.Parameters.Add(userName);
            command.Parameters.Add(pass);
            command.Parameters.Add(Uname);
            command.Parameters.Add(pic);
    
            connection.Open();
            command.ExecuteNonQuery();
        }
    }
    

    关于来自的OleDb连接的参数

    评论 当CommandType设置为Text时,OLE DB.NET提供程序不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。例如:

    SELECT * FROM Customers WHERE CustomerID = ?
    
    因此,OLEDBPParameter对象添加到OLEDBPParameterCollection的顺序必须直接对应于命令文本中参数的问号占位符的位置


    由于大多数答案都未能解决SQL注入漏洞,下面是一个参数化查询的示例。除了防止SQL注入攻击外,它还可以更轻松地解决这些类型的问题,并且您不需要担心引用或不引用参数

    System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection();
    connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Etay\Documents\Visual Studio 2012\WebSites\Josef\Shared\users.mdb";
    
    try
    {
        System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand();
        command.Connection = connection;
        connection.Open();
        command.CommandText = "INSERT INTO users (userName, passWord, Uname, pic, privacy) VALUES (?, ?, ?, ?, ?)";
        command.Parameters.Add(userName);
        command.Parameters.Add(pass);
        command.Parameters.Add(name);
        command.Parameters.Add(pic);
        command.Parameters.Add(privacy);
        command.ExecuteNonQuery();
        Response.Redirect("../HtmlPage.html");
    }
    finally
    {
        connection.Close();
    }
    

    由于大多数答案都未能解决SQL注入漏洞,下面是一个参数化查询的示例。除了防止SQL注入攻击外,它还可以更轻松地解决这些类型的问题,并且您不需要担心引用或不引用参数

    System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection();
    connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Etay\Documents\Visual Studio 2012\WebSites\Josef\Shared\users.mdb";
    
    try
    {
        System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand();
        command.Connection = connection;
        connection.Open();
        command.CommandText = "INSERT INTO users (userName, passWord, Uname, pic, privacy) VALUES (?, ?, ?, ?, ?)";
        command.Parameters.Add(userName);
        command.Parameters.Add(pass);
        command.Parameters.Add(name);
        command.Parameters.Add(pic);
        command.Parameters.Add(privacy);
        command.ExecuteNonQuery();
        Response.Redirect("../HtmlPage.html");
    }
    finally
    {
        connection.Close();
    }