【问题标题】:c# ado.net sqlparameter failsc# ado.net sql参数失败
【发布时间】:2014-11-03 15:49:00
【问题描述】:

我正在从 c# 以本地化语言(波斯语)传递 sqlparameter,但没有检索到行。数据库已经为 persioan_100_ci_ai 整理,表是整理 database_default

SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();
SqlDataReader dr = default(SqlDataReader);
dt.TableName = "temp";
try {
    if (!(conn.State == ConnectionState.Closed))
        conn.Close();
    if (conn.State == ConnectionState.Closed)
        conn.Open();
    cmd.Connection = conn;
    string qry = "Select * from users WHERE [Name]=@UserName AND [Pwd]=@Password";
    cmd.commandtext = qry;
    cmd.Parameters.Add("@UserName", SqlDbType.NVarChar, 50).Value = "ادمین";
    cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = "ادمین";
    dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    if (dr.HasRows) {
        dt.Load(dr);
    }

    return dt;
} catch (Exception ex) {
    return null;
} finally {
    dt = null;
    cmd.Connection = null;
    cmd.Parameters.Clear();
    cmd.Dispose();
}

它适用于 SSMS

declare @UserName nvarchar(50) = 'ادمين'
declare @Password nvarchar(50)= 'ادمين'
select * from Users where [name]=@UserName and [Pwd] = @Password 

当我在查询中嵌入变量而不是参数时,它甚至可以工作

SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();
SqlDataReader dr = default(SqlDataReader);
string pLoginName = "ادمین";
string pPassword = "ادمین";
dt.TableName = "temp";
try {
    if (!(conn.State == ConnectionState.Closed))
        conn.Close();
    if (conn.State == ConnectionState.Closed)
        conn.Open();
    cmd.Connection = conn;
    string qry = "Select * from users WHERE [Name]='" + pLoginName + "' AND [Pwd]='" + pPassword + "'";
    cmd.CommandText = qry;
    dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    if (dr.HasRows) {
        dt.Load(dr);
    }

    return dt;
} catch (Exception ex) {
    return null;
} finally {
    dt = null;
    cmd.Connection = null;
    cmd.Parameters.Clear();
    cmd.Dispose();
}

无法弄清楚我错在哪里。 请哪位大神指点一下。

【问题讨论】:

  • 使用cmd.Parameters.AddWithValue,有什么区别吗?
  • @HamidP:不要使用AddWithValue!查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 你是对的 marc - 这里我们用类型声明参数。所以内部库无法确定您传递的参数值的类型。特别是当参数必须为“Nvarchar”时,因为它使用 unicode
  • 仍然尝试了 AddWithValue 但结果相同 dr.hasrows = false。

标签: c# asp.net sql-server tsql ado.net


【解决方案1】:

我没有任何问题,我将这两个值都添加到我的测试数据库中。这是示例代码

        // Code in BO logic method
        string email = "ادمین";
        string password = "ادمین";


        SqlCommand cmd = new SqlCommand(@"SELECT * FROM Register WHERE Email=@Email AND Deleted=0 AND Password=@Pass");

        cmd.Parameters.AddWithValue(@"Email", email.Trim());
        cmd.Parameters.AddWithValue(@"Pass", password.Trim());

        DataSet dst = Varmebaronen.AppCode.DA.SqlManager.GetDataSet(cmd);

    //DataAccess Methods !
    public static DataSet GetDataSet(SqlCommand cmd)
    {
        return GetDataSet(cmd, "Table");
    }

    public static DataSet GetDataSet(SqlCommand cmd, string defaultTable)
    {
        SqlConnection conn = GetSqlConnection(cmd);

        try
        {
            DataSet resultDst = new DataSet();

            using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(resultDst, defaultTable);
            }

            return resultDst;
        }
        catch
        {
            throw;
        }
        finally
        {
            conn.Close();
        }
    }

DataSet 有一条记录,请尝试使用AddWithValue。如果再次没有发生问题,则问题不在参数中!

P.S 不要使用一个静态连接,应用程序池是你的朋友!

【讨论】:

  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 试过 AddWithValue 但结果相同 dr.hasrows = false。
【解决方案2】:

尝试将参数和值分配分开,如下所示:

// Create the parameter objects as specific as possible.
    cmd.Parameters.Add("@UserName", System.Data.SqlDbType.NVarChar, 50);
    cmd.Parameters.Add("@Password", System.Data.SqlDbType.NVarChar, 50);

    // Add the parameter values.  Validation should have already happened.
    cmd.Parameters["@UserName"].Value = "ادمین";
    cmd.Parameters["@Password"].Value = "ادمین";

【讨论】:

  • 尝试了相同但相同的结果 dr.hasrows = false。
  • 你可以试试 dr = cmd.ExecuteReader();
【解决方案3】:

尝试使用这个:

cmd.Parameters.Add(new SqlParameter("@Password", "ادمین"));

编辑:

让我们尝试不同的方式。如果您准备进行一些重新编码。我将发布一个有效的旧大学项目的示例。本质上是同一个概念。可能不是最好的方法,但它确实有效......

我在 .aspx 页面上使用了 DataAdapter、DataSet 和 GridView 控件。您标记了 ASP.net,但我不确定您尝试使用什么来显示数据。

string selectsql2 = "SELECT * FROM [dbo].Event_View WHERE (EventName LIKE '%' + @EventName + '%')";
SqlConnection connect2 = new SqlConnection(connectionstring2);
SqlCommand cmd = new SqlCommand(selectsql2, connect2);
SqlParameter pm = new SqlParameter("@EventName", txtEvents.Text);
cmd.Parameters.Add(pm);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds2 = new DataSet();
adapter.Fill(ds2);
gvEvents.DataSource = ds2;
gvEvents.DataBind();

【讨论】:

  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 尝试了相同但相同的结果 dr.hasrows = false。
  • 仍然尝试了 AddWithValue 但结果相同 dr.hasrows = false
  • 也许您可以尝试不同的方法?使用数据集。
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多