Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# .NET SqlDataReader:用户代码未处理SqlException_C#_.net_Sql_Sql Server_Sqlconnection - Fatal编程技术网

C# .NET SqlDataReader:用户代码未处理SqlException

C# .NET SqlDataReader:用户代码未处理SqlException,c#,.net,sql,sql-server,sqlconnection,C#,.net,Sql,Sql Server,Sqlconnection,正在使用创建的SQL Server表构建简单的.NET web应用程序。我不断地在SqlDataReader方面出错,并且一直坚持我的错误方向 下面是我的错误:附加信息:关键字“Table”附近的语法不正确 这是我的密码: 编辑: 第一版(编辑前): 表是一个关键字。如果您的表被称为table,则sql必须对其进行转义。请尝试[表格] 还请注意,您需要为用户名使用一个参数,即,其中username=@username,您还可以使用适当的值将一个具有该名称的参数添加到命令中。表是一个关键字。如果您

正在使用创建的SQL Server表构建简单的.NET web应用程序。我不断地在SqlDataReader方面出错,并且一直坚持我的错误方向

下面是我的错误:附加信息:关键字“Table”附近的语法不正确

这是我的密码:

编辑:

第一版(编辑前):


表是一个关键字。如果您的表被称为
table
,则sql必须对其进行转义。请尝试
[表格]


还请注意,您需要为用户名使用一个参数,即,
其中username=@username
,您还可以使用适当的值将一个具有该名称的参数添加到命令中。

表是一个关键字。如果您的表被称为
table
,则sql必须对其进行转义。请尝试
[表格]


还请注意,您需要为用户名使用一个参数,即,
其中username=@username
,您还可以使用相应的值将一个具有该名称的参数添加到命令中。

表是SQL中的保留关键字。尝试在其周围放置方括号:

SqlCommand cmd = new SqlCommand("SELECT Username from [Table] where Username = userName");

表是SQL中的保留关键字。尝试在其周围放置方括号:

SqlCommand cmd = new SqlCommand("SELECT Username from [Table] where Username = userName");

我认为您的SQL查询有两个问题

从Username=Username的表中选择Username

  • 是保留关键字。为表格使用另一个名称或[表格]
  • 最后一部分,Username=Username,也是错误的。如果你的意图是在那里有一个常数字符串,你应该考虑把用户名放在引号<强> \用户名> <强>中。别忘了转义符号。如果要将参数传递给SQLCommand,请在查询中使用@username,并以这种方式传递值

    cmd.Parameters[“@username”].Value=“Bob”


  • 我认为您的SQL查询有两个问题

    从Username=Username的表中选择Username

  • 是保留关键字。为表格使用另一个名称或[表格]
  • 最后一部分,Username=Username,也是错误的。如果你的意图是在那里有一个常数字符串,你应该考虑把用户名放在引号<强> \用户名> <强>中。别忘了转义符号。如果要将参数传递给SQLCommand,请在查询中使用@username,并以这种方式传递值

    cmd.Parameters[“@username”].Value=“Bob”


  • 您的AuthenticateMe方法似乎有点错误,无法对用户进行身份验证

    • 您使用的保留关键字(表)没有正确的分隔符 (方括号)
    • 您不会将用户名和密码传递给检查的查询 如果用户在场
    • 您调用两次ExecuteReader(?)
    • 您可以使用使用的相同值检查查询返回的值 用于搜索(无用)
    所以你可以用这种方式重写代码

    private bool AuthenticateMe(string userName, string password)
    {
        string connectionString = @".....";
        string commandText = "SELECT COUNT(*) from [Table] where Username = @name AND Pass = @pwd");
        using(SqlConnection sqlConnection1 = new SqlConnection(connectionString))
        using(SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
        {
             sqlConnection1.Open();
             cmd.Parameters.AddWithValue("@name", username);
             cmd.Parameters.AddWithValue("@pwd", password);
             int result = Convert.ToInt32(cmd.ExecuteScalar());
             return (result > 0);
        }
    }
    

    另外,请记住,将密码以纯文本形式存储在数据库中被认为是一种不好的做法。应该对存储的密码应用某种哈希函数,以禁止在有人获得数据库副本时出现任何安全问题。

    您的AuthenticateMe方法似乎有点错误,无法对用户进行身份验证

    • 您使用的保留关键字(表)没有正确的分隔符 (方括号)
    • 您不会将用户名和密码传递给检查的查询 如果用户在场
    • 您调用两次ExecuteReader(?)
    • 您可以使用使用的相同值检查查询返回的值 用于搜索(无用)
    所以你可以用这种方式重写代码

    private bool AuthenticateMe(string userName, string password)
    {
        string connectionString = @".....";
        string commandText = "SELECT COUNT(*) from [Table] where Username = @name AND Pass = @pwd");
        using(SqlConnection sqlConnection1 = new SqlConnection(connectionString))
        using(SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
        {
             sqlConnection1.Open();
             cmd.Parameters.AddWithValue("@name", username);
             cmd.Parameters.AddWithValue("@pwd", password);
             int result = Convert.ToInt32(cmd.ExecuteScalar());
             return (result > 0);
        }
    }
    

    另外,请记住,将密码以纯文本形式存储在数据库中被认为是一种不好的做法。应该对存储的密码应用某种哈希函数,以禁止在有人获得数据库副本时出现任何安全问题。

    thx以获取响应。我输入了你的建议,汇编的很好,但没有给我一个结果。我更新了上面的代码。我的错误,应该是ExecuteScalar而不是ExecuteOnQuery。ExecuteScalar返回返回的数据集第一行的第一列。SELECT COUNT(*)只返回一行一列。ExecuteOnQuery返回受INSERT/UPDATE/DELETE操作影响的行数,而不是SELECT语句返回的行数告诉我指定的强制转换无效:int result=(int)cmd.ExecuteScalar();再次检查THX上方的修复以获得响应。我输入了你的建议,汇编的很好,但没有给我一个结果。我更新了上面的代码。我的错误,应该是ExecuteScalar而不是ExecuteOnQuery。ExecuteScalar返回返回的数据集第一行的第一列。SELECT COUNT(*)只返回一行一列。ExecuteOnQuery返回受INSERT/UPDATE/DELETE操作影响的行数,而不是SELECT语句返回的行数告诉我指定的强制转换无效:int result=(int)cmd.ExecuteScalar();再次检查上面的修复程序