C# SQLCommand 不起作用

本文关键字:不起作用 SQLCommand | 更新日期: 2023-09-27 18:35:41

>我有一个具有以下方法的WebService:

    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    [WebMethod]
    public string Login(string passwort, string email, string firma)
    {
        return LoginHelper.Login(passwort, email, firma);
    }

我的登录助手代码:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
namespace WebService1
{
    public class LoginHelper
    {
        public static string Login(string passwort, string email, string firma)
        {
            string userName = "";
            SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC'SQLEXPRESS;Initial Catalog=works;Integrated Security=true;");
        SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                                  WHERE email = @email", con);
        cmd.Parameters.AddWithValue("@email", email);
        con.Open();
        SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
      {
   //userName += dr["email"].ToString();
   //userName += dr["passwort"].ToString();
   userName += dr["firma"].ToString();
     }
    dr.Close();
    con.Close();
    return userName;
        }

    }
}

感谢您的帮助伙计们

我已经编辑了我的问题。该解决方案现在安全吗?我的意思是反对SQL注入。还有什么我可以做得更好的吗?

C# SQLCommand 不起作用

你正在调用LoginHelper.Login(passwort, email, firma);

但在你的方法中

public static string Login(string email, string passwort, string firma)

电子邮件是第一个参数。

实际上在电子邮件参数中您有密码,这就是为什么它不返回任何结果的原因

LoginHelper中更改您的login方法,如下所示

public static string Login(string passwort, string email, string firma)
{
    string userName = "";
    using (SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC'SQLEXPRESS;Initial Catalog=works;Integrated Security=true;"))
    using(SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData WHERE email = @email", con))
    {
        cmd.Parameters.AddWithValue("@email", email);
        con.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                if (rdr["firma"]  != DBNull.Value)
                {
                    userName += rdr["firma"].ToString();
                }
            }
        }
    }
    return userName;
}

如果您的电子邮件地址包含 @ 字符,那可能是您的问题。@ 是 SQLCommand 的参数标记。它会认为您的电子邮件地址的后半部分是一个sql参数。您需要使用参数传递电子邮件地址。这也保护你免受SQL注入的影响。Akatakritos的回答有一个示例,说明如何将电子邮件作为计时器传递。

此外,出于安全和性能原因,您应该使用 SqlParameters。阅读 SQL 注入攻击。

string userName = "";
SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC'SQLEXPRESS;Initial Catalog=works;Integrated Security=true;");
SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                                  WHERE email = @email" con);
cmd.Parameters.AddWithValue("@email", email);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
   //userName += dr["email"].ToString();
   //userName += dr["passwort"].ToString();
   userName += dr["firma"].ToString();
}
dr.Close();
con.Close();
return userName;

根据其他答案和评论。

如果您不打算使用ORM(实体),则存在安全问题 框架/NHibernate/etc...)请使用参数化查询

解决您的问题:

  • 数据是否在您的数据库中?
  • 你指向正确的数据库吗?
  • 你的 SQL 正确吗?
  • 您的 SQL 正在运行吗?
  • 运行 SQL 事件探查器并查看正在运行的 SQL,然后在 SQL Management Studio 中进行测试

不要在代码中传递参数,而是尝试使用 Sqlparameter 添加参数。最佳做法是使用 SQL 参数添加参数。您还可以通过调试来检查电子邮件的值。您是否传递了正确的信息。

        SqlConnection conn = new SqlConnection(connectionString);
        conn.Open();
        SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                              WHERE email = @email" conn);
        cmd.Parameters.AddWithValue("@email", email);                     
        cmd.Prepare();
        cmd.ExecuteNonQuery();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
            {                  
               userName += dr["firma"].ToString();
            }
        dr.Close();
        conn.Close();