【问题标题】:Retrieve specific value in where clause in c#在 C# 的 where 子句中检索特定值
【发布时间】:2016-10-03 06:02:58
【问题描述】:

我想在代码中获取 cmdd(@PermissionAccessoageID) 值以及如何实现。

我收到此错误

System.Data.dll 中出现“System.ArgumentException”类型的异常,但未在用户代码中处理

附加信息:不存在从对象类型 System.Data.SqlClient.SqlCommand 到已知托管提供程序本机类型的映射。

我的代码:

protected void Add_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[1] { new DataColumn("Pages") });

    foreach (GridViewRow row in addGridView.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            CheckBox chkRow = (row.Cells[1].FindControl("chkboxaddView") as CheckBox);
            CheckBox chkRow1 = (row.Cells[2].FindControl("chkboxaddEdit") as CheckBox);
            string aaa = row.Cells[0].Text;

            if (chkRow.Checked)
            {
                con.Open();
                var vaala = chkRow.Checked ? 1 : 0;
                var vaalaa = chkRow1.Checked ? 1 : 0;
                var val = chkaddisactive.Checked ? 1 : 0;
                var vall = chkboxisactive.Checked ? 1 : 0;
                string sqlcmd = "select AccesspageID From AccessPages where pages='" + row.Cells[0].Text + "'";

                SqlCommand cmdd = new SqlCommand(sqlcmd, con);
                cmdd.CommandType = CommandType.Text;
                cmdd.ExecuteScalar();

                string query = "add3tables";         //Stored procedure name 
                SqlCommand com = new SqlCommand(query, con);  //creating  SqlCommand  object
                com.CommandType = CommandType.StoredProcedure;  //here we declaring command type as stored procedure

                // adding parameters to SqlCommand below 
                com.Parameters.AddWithValue("@Name", txtaddrolename.Text.ToString());
                string unique_string = Guid.NewGuid().ToString();
                com.Parameters.AddWithValue("@RoleID ", unique_string);
                com.Parameters.AddWithValue("@IsActive ", val);
                com.Parameters.AddWithValue("@PermissionRoleID ", unique_string);
                com.Parameters.AddWithValue("@View ", vaala);
                com.Parameters.AddWithValue("@Edit ", vaalaa);
                com.Parameters.AddWithValue("@PermissionAccessoageID ", cmdd);

                com.ExecuteNonQuery();
                con.Close();
            }

            if (chkRow1.Checked == false)
            {
                var vaala = chkRow.Checked ? 1 : 0;
                var vaalaa = chkRow1.Checked ? 1 : 0;
                var val = chkaddisactive.Checked ? 1 : 0;
                var vall = chkboxisactive.Checked ? 1 : 0;

                SqlCommand cmdd = new SqlCommand("select AccesspageID From AccessPages where pages='" + aaa + "'", con);
                con.Open();

                cmdd.CommandType = CommandType.Text;
                string query = "add3tables";         //Stored procedure name 
                SqlCommand com = new SqlCommand(query, con);  //creating  SqlCommand  object
                com.CommandType = CommandType.StoredProcedure;  //here we declaring command type as stored procedure

                // adding parameters to SqlCommand below 
                com.Parameters.AddWithValue("@Name", txtaddrolename.Text.ToString());
                string unique_string = Guid.NewGuid().ToString();
                com.Parameters.AddWithValue("@RoleID ", unique_string);
                com.Parameters.AddWithValue("@IsActive ", val);
                com.Parameters.AddWithValue("@PermissionRoleID ", unique_string);
                com.Parameters.AddWithValue("@View ", vaala);
                com.Parameters.AddWithValue("@Edit ", vaalaa);
                com.Parameters.AddWithValue("@PermissionAccessoageID ", cmdd);
                com.ExecuteNonQuery();
                con.Close();
            }
        }

【问题讨论】:

  • 能否详细说明为什么要获取 cmdd(@PermissionAccessoageID) 的值?是最后插入的行还是其他?
  • Cmdd 已在数据库中插入行。我想检索 AccesspageID
  • 您的第一个 select 语句似乎没用。您永远不会在代码中的任何地方使用结果。在你的第二个 if 语句中,你甚至不执行它。
  • @Vinoth add3tables 是什么?你想在这里做什么?您使用SqlCommand API 是完全错误的方式!参数需要出现在您正在执行的查询中。这不是你的情况。
  • 旁注:在 for 循环中访问数据库是提高效率的红灯。如果您有其他选择,那就更好了。

标签: c# asp.net


【解决方案1】:

您忘记使用 select 语句的结果,需要将其分配给变量。

在您的第一个 if 块中,您实际执行它,但不要使用结果。在第二个 if 块中,您忘记了 .ExecuteScalar() 呼叫。

object oAccesspageID = cmdd.ExecuteScalar();
int? AccesspageID = (int?)(!Convert.IsDBNull(oAccesspageID) ? oAccesspageID : null);
/* ... code ommitted*/

//assuming @PermissionAccessoageID is int
com.Parameters.AddWithValue("@PermissionAccessoageID ", AccesspageID.Value);

由于 ExecuteScalar 可以返回 null,如果没有找到结果,您需要以某种方式对此进行说明。您可能希望在调用您的 SProc 之前添加另一个 if(AccesspageID.HasValue) { } 调用,以确保它不会尝试使用无效值运行。

【讨论】:

    【解决方案2】:

    这一行是问题:

    com.Parameters.AddWithValue("@PermissionAccessoageID ", cmdd);
    

    cmdd 的类型为 SqlCommand,您不能有该类型的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多