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注入。还有什么我可以做得更好的吗?
你正在调用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();