尝试将 SqlDataAdapter 中的 SqlCommand 作为参数传递

Posted

技术标签:

【中文标题】尝试将 SqlDataAdapter 中的 SqlCommand 作为参数传递【英文标题】:Trying to pass SqlCommand in SqlDataAdapter as parameters 【发布时间】:2017-06-07 02:45:36 【问题描述】:

我已经成功构建了执行选择命令的方法。它工作正常。然后我将代码更改为SqlDataAdapter DA = new SqlDataAdapter();

我尝试在参数中将SqlCommand 作为CommandType.Text 传递,但我无法成功。我得到错误。如果我可以将它作为参数传递,有什么办法吗?请看我的代码。

运行代码(aspx页面代码)

if ((!string.IsNullOrEmpty(user_login.Value)) && (!string.IsNullOrEmpty(user_pass.Value)))

        // username & password logic
        DataTable dt = new DataTable();
        string strQuery = "SELECT 1 FROM TBL_USER_INFO WHERE USERNAME = @USERNAME AND PASSWORD = @PASSWORD";

        SqlCommand cmd = new SqlCommand(strQuery);
        cmd.Parameters.Add("@USERNAME", SqlDbType.VarChar).Value = user_login.Value.Trim();
        cmd.Parameters.Add("@PASSWORD", SqlDbType.VarChar).Value = user_pass.Value.Trim();

        DBConnection conn_ = new DBConnection();

        dt = conn_.SelectData(cmd);

        if (conn_.SQL_dt.Rows.Count > 0)
        
            Response.Redirect("Home.aspx", false);
        
    

成功连接类代码

public DataTable SelectData(SqlCommand command)

    try
    
       conn.Open();

       SqlDataAdapter DA = new SqlDataAdapter();

       command.CommandType = CommandType.Text;
       command.Connection = conn;

       DA.SelectCommand = command;
       DA.Fill(SQL_dt);

       return SQL_dt;
   
   catch (Exception ex)
   
       return null;
   
   finally
   
       conn.Close();
   

如何将CommandType.Text 作为SqlDataAdapter 的参数传递?

错误代码

public DataTable SelectData(SqlCommand command)

    try
    
        conn.Open();

        SqlDataAdapter DA = new SqlDataAdapter(command.CommandType.ToString(), conn);

        // command.CommandType = CommandType.Text;
        // command.Connection = conn;
        DA.SelectCommand = command;
        DA.Fill(SQL_dt);

        return SQL_dt;
    
    catch (Exception ex)
    
        return null;
    
    finally
    
        conn.Close();
    

我收到此错误:

System.InvalidOperationException:填充:SelectCommand.Connection 属性尚未初始化。 在 System.Data.Common.DbDataAdapter.GetConnection3(DbDataAdapter 适配器,IDbCommand 命令,String 方法)...

【问题讨论】:

【参考方案1】:
public DataTable SelectData(string query)
        
            DataTable dt = new DataTable();
            using (SqlConnection con = new SqlConnection("Your Connection String here"))
            
                con.Open();
                using (SqlCommand cmd = con.CreateCommand())
                
                    cmd.CommandText = query;
                    cmd.CommandType = CommandType.Text;
                    using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
                    
                        adp.Fill(dt);
                        return dt;
                    
                
            
        

使用方法:

SelectData("select * from yourTable");

【讨论】:

【参考方案2】:

红军有答案。只是为了稍微清理一下代码......

    public DataTable SelectData(string query)
    
        using (var connection = new SqlConnection("myConnectionString"))
        using (var command = new SqlCommand(query, connection))
        using (var adapter = new SqlDataAdapter(command))
        
            var dt = new DataTable();

            connection.Open();
            adapter.Fill(dt);

            return dt;
        
    

【讨论】:

【参考方案3】:

其实你应该在SQLCommand上传递连接对象,希望对你有帮助

 DBConnection conn_ = new DBConnection();
SqlCommand cmd = new SqlCommand(strQuery,conn_);

【讨论】:

【参考方案4】:

您收到的错误与 CommandType.Text 无关,它表示您已初始化 SelectCommand 的连接属性。基本上你应该取消注释“command.Connection = conn;”摆脱这个错误。如果您仍然遇到任何其他问题,最好在问题中提供这些详细信息以提供准确的答案。

【讨论】:

我已在方法SqlDataAdapter DA = new SqlDataAdapter(command.CommandType.ToString(), conn) 中将连接作为参数conn 传递

以上是关于尝试将 SqlDataAdapter 中的 SqlCommand 作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataAdapter.Fill 命令使 SQL CPU 达到峰值

如何用DataSet 和SqlDataAdapter读取SQL数据库中某列的多行数据?

如何在 BP 自动化中使用 SQLDataAdapter 中的更新语句

SqlDataAdapter概述

C#中SqlDataAdapter的使用小结

.Net SqlDataAdapter 和 SQL Server 中的触发器