【问题标题】:How to return sql query result messages with c# ASP.net如何使用 c# ASP.net 返回 sql 查询结果消息
【发布时间】:2016-01-01 02:07:22
【问题描述】:

我尝试了以下代码,但我无法从中找到成功消息。这里commandText 可以插入、更新、删除或选择查询,如果它是选择查询,我需要数据集,否则成功消息如 sql 结果@ 987654322@。我不能使用ExecuteScalarExecuteNonQuery 方法,因为执行选择查询时我需要数据集输出。

public static  DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
    {
        using (SqlConnection cn = new SqlConnection(connectionString))
        {
            cn.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
            {
                MessageInfo += "\n" + e.Message;
            };
            cn.FireInfoMessageEventOnUserErrors = true;

            cn.Open();
            using (SqlCommand command = new SqlCommand(commandText, cn))
            {

                using (SqlDataAdapter adapter = new SqlDataAdapter(command))
                {
                    DataSet dt = new DataSet();
                    adapter.Fill(dt); // Do something with DataTable
                    return dt;
                }
            }
        }
    }

【问题讨论】:

  • 我已经看到了很多关于这个的问题,但似乎唯一真正的选择是自己实现这些消息。问题是您不会从数据库中生成实际消息。
  • 是的。我检查了事件处理程序除了第一次之外没有调用。并且 MessageInfo 为空。

标签: c# sql-server


【解决方案1】:

我使用的是 System.Data 版本 4.0.0.0,以下适用于我的 UPDATE、INSERT、DELETE 和 SELECT 语句。

using (SqlDataAdapter adapter = new SqlDataAdapter(command))
{
    var rowsAffected = -1;

    adapter.SelectCommand.StatementCompleted += delegate (object sender, StatementCompletedEventArgs e)
    {
        rowsAffected = e.RecordCount;
    };

    DataSet dt = new DataSet();
    adapter.Fill(dt); // Do something with DataTable
    return dt;
}

【讨论】:

    【解决方案2】:

    我设法通过以下方式解决了它,但希望有更好的方法。

     string type = Query.Trim().Split(' ')[0].ToLower();
        if ( type == "select")
        {
            DataSet result = SqlHelper.ExecuteDataset(CommandType.Text, Query);                
    
        }
        else
        {                
            if(type == "insert") type="inserted."; else type=type+"d.";
            int a=(int)SqlHelper.ExecuteNonQuery(CommandType.Text, Query);
            if (a > 0)
            {
                lblInfo.Text = "Query executed successfully. " + a.ToString() + " row(s) " + type;                
    
            }
        }
    

    我又找到了一个,比上面那个好。

    query = resultQuery + "  SELECT '('+CONVERT(VARCHAR(10),@@ROWCOUNT)+' row(s) affected)' AS RESULT";
    DataSet result = DataSet result = SqlHelper.ExecuteDataset(CommandType.Text, query);
    
            if (result.DefaultViewManager.DataViewSettingCollectionString.Contains("Table") == true)
            {
                sqlGrid.Visible = true;
                sqlGrid.DataSource = result;
                sqlGrid.DataBind();
            }
            if (sqlGrid.Rows.Count==1 && sqlGrid.Rows[0].Cells.Count==1)
            {
                string text = (sqlGrid.Rows[0].Cells[0]).Text;
                if (text.Contains("row(s) affected"))
                {
                    lblInfo.Text=text;
                    lblInfo.Visible=true;
                    sqlGrid.DataSource = null;
                    sqlGrid.DataBind();
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      相关资源
      最近更新 更多