【问题标题】:DataAdapter Fill gets no parameters from the Command objectDataAdapter Fill 不从 Command 对象获取任何参数
【发布时间】:2013-06-13 14:15:26
【问题描述】:

我正在尝试从我的 DataAdapter 填充数据表,但数据库不断报告没有为查询指定参数...

这是我的代码:

    #region "Properties"
    public string sql { get; protected set; }
    public CommandType cType { get; protected set; }
    public List<MySqlParameter> args { get; protected set; }
    public string rValue { get; protected set; }

    private MySqlConnection conn;

    private string server = "127.0.0.1";
    private string database = "stman";
    private string user = "root";
    private string password = "root";
    #endregion

    #region "Constructor Logic"
        public Database(string CommandText, CommandType CommandType, List<MySqlParameter> Parameters, string ReturnParameter = "")
        {
            buildConnection();

            sql = CommandText;
            cType = CommandType;
            args = Parameters;
            rValue = ReturnParameter;
        }

        public Database(string CommandText, CommandType CommandType)
        {
            buildConnection();

            sql = CommandText;
            cType = CommandType;
        }

        private void buildConnection()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(String.Format("data source={0}; initial catalog={1}; user id={2}; password={3};", server, database, user, password));

            conn = new MySqlConnection(sb.ToString());
        }
    #endregion

    public DataTable GetDataTable()
    {
        DataTable dt = new DataTable();
        MySqlDataAdapter da = new MySqlDataAdapter();

        using (MySqlCommand cmd = new MySqlCommand(sql, conn))
        {
            if (args.Count > 0)
            {
                cmd.Parameters.AddRange(args.ToArray());
            }

            da.SelectCommand = cmd;
            da.Fill(dt);
        }

        if (dt.Rows.Count > 0)
        {
            return dt;
        }
        else
        {
            return null;
        }
    }

GetDataTable 函数读入 List&lt;MySqlParameter&gt; 以获取查询所需的参数 - 此 List 在调用代码中定义。

da.Fill(dt); 被击中时,MySqlCommand 确实具有相关查询的正确参数,并且根据堆栈跟踪(见下文)判断,似乎尝试从 mysql 获取数据确实通过,实际上是 mysql 发回了这个错误:

这是堆栈跟踪:

[MySqlException (0x80004005): PROCEDURE stman.Users_SelectByEmailAndPassword 的参数数量不正确;预期 2,得到 0] MySql.Data.MySqlClient.MySqlStream.ReadPacket() +383 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& 影响行,Int64& 插入 ID)+116 MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId) +54 MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) +145 MySql.Data.MySqlClient.MySqlDataReader.NextResult() +1258 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)+2364 MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior 行为)+41 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)+10 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令,CommandBehavior 行为)+140 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand 命令,CommandBehavior 行为)+160 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +108 d:\Development\stman\stman\App_Code\Database.cs:85 中的 stman.Database.GetDataTable() d:\Development\stman\stman\App_Code\LoginContext.cs:45 中的 stman.LoginContext.DoLogin() d:\Development\stman\stman\Login.aspx.cs:40 中的 stman.Login.processLogin() stman.Login.btnLogin_Click(Object sender, EventArgs e) in d:\Development\stman\stman\Login.aspx.cs:32 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9553594 System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串 eventArgument)+103 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument)+10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

多年来我一直在填写这样的数据表,这是我第一次遇到此错误。我不知道为什么会这样,也不知道如何解决。

谁能帮我弄清楚参数的去向?

编辑
针对 Renan 的评论:

参数名称相同。
实例化此类时,查询文本(在本例中为存储过程的名称)被传递到 sql 属性中。
最后,我的 IDE 的配色方案就是 VS2012 Dark 主题

【问题讨论】:

  • 您确定应用中的参数名称与存储过程中的名称匹配吗?另外,只有我还是命令根本没有查询?它至少不应该有程序的名称吗?最后但同样重要的是,我想要那个配色方案。
  • 查询是通过类的构造函数发送的...构造函数根据传入的值设置属性。我这样做是为了封装,但不是 100% 确定我做得对。配色方案为 VS2012 Dark 主题:D

标签: c# mysql data-binding


【解决方案1】:

好吧,这不是我在代码中完成的事情的问题,而是我没有做的事情的问题。

虽然代码中没有真正的错误,但它没有为 MySqlCommand 指定 CommandType。

我通过添加这一行来解决这个问题(指定对象要使用的 CommandType):

cmd.CommandType = cType;

这是完整的代码:

#region "Properties"
public string sql { get; protected set; }
public CommandType cType { get; protected set; }
public List<MySqlParameter> args { get; protected set; }
public string rValue { get; protected set; }

private MySqlConnection conn;

private string server = "127.0.0.1";
private string database = "stman";
private string user = "root";
private string password = "root";
#endregion

#region "Constructor Logic"
    public Database(string CommandText, CommandType CommandType, List<MySqlParameter> Parameters, string ReturnParameter = "")
    {
        buildConnection();

        sql = CommandText;
        cType = CommandType;
        args = Parameters;
        rValue = ReturnParameter;
    }

    public Database(string CommandText, CommandType CommandType)
    {
        buildConnection();

        sql = CommandText;
        cType = CommandType;
    }

    private void buildConnection()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(String.Format("data source={0}; initial catalog={1}; user id={2}; password={3};", server, database, user, password));

        conn = new MySqlConnection(sb.ToString());
    }
#endregion

public DataTable GetDataTable()
{
    DataTable dt = new DataTable();
    MySqlDataAdapter da = new MySqlDataAdapter();

    using (MySqlCommand cmd = new MySqlCommand(sql, conn))
    {
        if (args.Count > 0)
        {
            cmd.Parameters.AddRange(args.ToArray());
        }

        cmd.CommandType = cType;

        da.SelectCommand = cmd;
        da.Fill(dt);
    }

    if (dt.Rows.Count > 0)
    {
        return dt;
    }
    else
    {
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 2011-06-21
    • 1970-01-01
    • 2023-03-14
    • 2023-03-20
    • 1970-01-01
    • 2018-06-23
    • 2018-05-19
    • 2023-03-18
    相关资源
    最近更新 更多