【问题标题】:Not getting count for datatable object没有得到数据表对象的计数
【发布时间】:2016-07-16 12:20:10
【问题描述】:

我想检查查询中是否存在任何记录。

所以我尝试的是

 DataTable dtmkeylength = new DataTable("select count(lease_no) from XXACL_PROSPECTIVE_DATA_SAVE where mkey = " + Request.QueryString["userid"].ToString() + "");

        if (dtmkeylength.Rows.Count > 0)
        {
            HidMode.Value = "M";
            HidMKey.Value = dtmkeylength.Rows[0]["Mkey"].ToString();
        }

下面的数据表对象有 2 记录到数据库中,但它仍然没有进入 IF 条件。

为什么?

【问题讨论】:

  • 好像这需要调试一下,尝试调试dtmkeylength实例,看看是否真的有任何数据检索到,我怀疑select语句没有返回任何行
  • 通过调用new DataTable("select count(lease_no) from XXACL_PROSPECTIVE_DATA_SAVE where mkey = " + Request.QueryString["userid"].ToString() + "");,您只需创建名称为select count(lease_no) from XXACL_PROSPECTIVE_DATA_SAVE where mkey = + Request.QueryString["userid"].ToString();DataTable
  • @SeM: 那么我该怎么做才能获取数据表对象中的记录?
  • 阅读this文章

标签: c# asp.net datatable


【解决方案1】:

在您的查询中添加“as NNN”:

...select count(lease_no) as result...

所以您可以通过名称引用它。

然后,查询的时候可以输入:

dtmkeylength.Rows[0]["result"]

希望能帮到你:)

编辑

var userId = Request.QueryString["UserId"];

if(string.IsNullOrEmpty(userId)){
  throw new Exception("No UserID = no fun!");
}

DataTable dtmkeylength = new DataTable("select count(lease_no) from XXACL_PROSPECTIVE_DATA_SAVE where mkey =" + Request.QueryString["userid"].ToString() + "");

        if (dtmkeylength.Rows.Count > 0)
        {
            HidMode.Value = "M";
            HidMKey.Value = dtmkeylength.Rows[0][0].ToString();
        }

【讨论】:

  • 我认为dtmkeylength.Rows.Count 应该包含一些东西,不管你建议的列别名是什么,对吧?
  • 行数应该是1,因为他选择了一个没有分组的计数,所以是的,没错。我猜他也可以只处理第 0 列而不是使用列别名。没有那么冗长,但仍然有效
  • 是的,你是对的,它应该至少包含1行,值为0
  • @PedroG.Dias:你能完全更新你的答案吗?因为我很困惑如何写它?
  • 试试这个:HidMKey.Value = dtmkeylength.Rows[0][0].ToString();
【解决方案2】:

我认为更好的方法是使用ExecuteScalar,因为您只使用计数。

using (SqlConnection conn = new SqlConnection(connString))
{
    String sql = "select count(lease_no) from XXACL_PROSPECTIVE_DATA_SAVE where mkey = @mkey";
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.Parameters.Add("@mkey", (int) Request.QueryString["userid"]);

    try
    {
        conn.Open();
        int rowCount = (int) cmd.ExecuteScalar();

        if (rowCount  > 0)
        {
            HidMode.Value = "M";
            HidMKey.Value = dtmkeylength.Rows[0]["Mkey"].ToString();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

还要注意参数化查询 - @mkey 作为参数提供,不使用字符串连接(这可能导致 Sql Injection)

【讨论】:

  • 如何将 mkey 作为参数传递?与用户登录时一样
  • 您可以有一个额外的if 条件来处理未记录的用户案例。当用户未登录时,您的代码应该做什么?
  • 如果用户未登录,它将重定向到错误页面。如果用户未登录,您可以更新代码...
【解决方案3】:

试试这个:

static void Main(string[] args)
        {
            string param = "VINET";//your param here
            string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
            using(SqlConnection  conn = new SqlConnection(conStr))
            {
                conn.Open();
                //modify your command on below line
                SqlCommand cmd = new SqlCommand("select count(OrderId) from Orders where CustomerID='" + param + "'");
                cmd.Connection = conn;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);
                conn.Close();
                if(ds.Tables[0].Rows.Count > 0)
                {
                    //do other staff
                }
            }
        }   

*请按照注释行

编辑
下面是您填充数据表的方式的调试屏幕截图。如您所见,dt 将命令检测为表名而不是命令。

【讨论】:

  • 谢谢,但如果您只在我的问题中告诉我,那就太好了。我也创建了它,它正在工作
  • 您在 DataTable 构造函数中放置选择命令的方式不是写入,因为即使您放置命令字符串,构造函数也会将其检测为 TABLE NAME(请参阅 DataTable 的构造函数重载)。结果,您的数据表从未填充过,并且正如预期的那样,它不会进入 IF 条件
【解决方案4】:

即使行数为零,它也会始终返回行。

试试

int number = dtmkeylength.Rows[0].Field<int>(0);

if (number > 0)
{
...
}

【讨论】:

  • 这样尝试过。DataTable dtmkeylength = new DataTable("select count(lease_no) as result from XXACL_PROSPECTIVE_DATA_SAVE where mkey =" + Request.QueryString["userid"].ToString() + ""); int number = Convert.ToInt32(dtmkeylength.Rows[0]["result"]); 出现错误,因为 位置 0 处没有行。
【解决方案5】:

DataTable 没有采用 select 语句的构造函数,这就是为什么它是空的,尚未选择任何内容!

可用的构造函数重载有以下三种:

System.Data.DataTable dtmkeylength = new System.Data.DataTable();

或者

System.Data.DataTable dtmkeylength = new System.Data.DataTable("TableName);

或者

System.Data.DataTable dtmkeylength = new System.Data.DataTable("TableName", "tableNameSpace");

查看thisthis 示例,了解如何使用DataTable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多