我访问一个存储过程过程时一直出错:
"[ODBC SQL Server Driver][SQL Server]过程 'InsertNew' 需要参数 '@Title',但未提供该参数。"
这是什么意思? 生成插入命令的代码:
insertCmd = conn.CreateCommand();
insertCmd.CommandText = this.storedProcedure;
insertCmd.CommandType = CommandType.StoredProcedure;
//
// derive parameters from database.
//
conn.Open();
DeriveParameters(insertCmd);
//
// setting source parameters for using later.
//
foreach (DbParameter p in insertCmd.Parameters)
{
    p.SourceColumn = p.ParameterName.StartsWith("@") ? p.ParameterName.Substring(1) : p.ParameterName;
}执行命令的代码:
Hashtable availableColumns = this.GetAvailableColumns();
//
// binding parameter values for insert command.
//
foreach (DbParameter p in insertCmd.Parameters)
{
    if (p.Direction == ParameterDirection.ReturnValue || p.Direction == ParameterDirection.Output)
    {
        continue;
    }    if (availableColumns.ContainsKey(p.SourceColumn))
    {
        p.Value = row[p.SourceColumn];
    }
    else
    {
        p.Value = DBNull.Value;
    }
}
try
{
    insertCmd.ExecuteNonQuery();
}
catch (DbException e)
{
    //
    // the handler returns true means continue insertion.
    //
    bool ignore = this.OnInsertionFailed(new InsertionFailedHandlerArgs(row, e));
    if (!ignore)
    {
        //
        // rool back all insertions.
        //
        trans.Rollback();
        return;
    }
}

解决方案 »

  1.   

    就是说,你没有给存储过程提供参数 '@Title'
      

  2.   

    我怀疑是 OdbcCommandBuilder.DeriveParameters() 的Bug!!!! 经调试可以确定从数据源获得了参数, 但还是提示说
    "[ODBC SQL Server Driver][SQL Server]过程 'InsertNew' 需要参数 '@Title',但未提供该参数。"
    晕倒!
      

  3.   

    E章兄,看看这段代码有错吗? 我感觉应该没有问题的,因为如果用OleDb就没事.try
    {
        using (DbConnection conn = this.GetConnection())
        {
            DataTable dt = new DataTable("郑州大学新闻信息");
            dt.Columns.Add("Title", typeof(String)).ExtendedProperties["FieldUnique"] = true;
            dt.Columns.Add("PubDepartment", typeof(String));        DataRow row = dt.NewRow();
            row["Title"] = "新闻标题1";
            row["PubDepartment"] = "发布单位";
            dt.Rows.Add(row);        row = dt.NewRow();
            row["Title"] = "新闻标题2";
            row["PubDepartment"] = "sdfasdfsdf";
            dt.Rows.Add(row);        row = dt.NewRow();
            row["Title"] = "新闻标题3";
            row["PubDepartment"] = "发布单位";
            dt.Rows.Add(row);        DbCommand cmd = conn.CreateCommand();
            cmd.CommandText = "InsertRow";
            cmd.CommandType = CommandType.StoredProcedure;        conn.Open();
            OdbcCommandBuilder.DeriveParameters((OdbcCommand)cmd);        //Database2 database = GetDatabase(dt, this.textBox2.Text);
            //database.ColumnNotFound += new ColumnNotFoundHandler(database_ColumnNotFound);
            //database.ExistedRowFound += new ExistedRowFoundHandler(database_ExistedRowFound);
            //database.InsertionFailed += new InsertionFailedHandler(database_InsertionFailed);        foreach (DataRow r in dt.Rows)
            {
                //database.Insert(r);
                //database.Flush();
                cmd.Parameters["@Title"].Value = r["Title"];
                cmd.Parameters["@PubDepartment"].Value = r["PubDepartment"];
                cmd.ExecuteNonQuery();
            }
        }}
    catch (NoAnyColumnFoundException)
    {
        this.label1.Text = "在数据库中找不到任何匹配的字段。";
    }
    catch (Exception ex)
    {
       this.label1.Text = ex.Message;
    }
      

  4.   

    完整的相关代码如下,其中InsertRow存储过程就两个参数, 正好对应dt表的两个列:private DbConnection GetConnection()
    {
        if (this.rbOleDb.Checked)
        {
            return new OleDbConnection("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bget;Data Source=(local)");
        }
        else
        {
            return new OdbcConnection("Driver={SQL Server};Server=(local);Database=bget;Uid=sa");
        }
    }private void DeriveParameters(DbCommand cmd)
    {
        if (this.rbOleDb.Checked)
        {
            OleDbCommand oleCmd = cmd as OleDbCommand;
            if (oleCmd == null)
            {
                throw new ArgumentException("An OleDbCommand is required.", "cmd");
            }
            else
            {
                OleDbCommandBuilder.DeriveParameters(oleCmd);
            }
        }
        else
        {
            OdbcCommand odbcCmd = cmd as OdbcCommand;
            if (odbcCmd == null)
            {
                throw new ArgumentException("An OdbcCommand is required.", "cmd");
            }
            else
            {
                OdbcCommandBuilder.DeriveParameters(odbcCmd);
            }
        }
    }private void btnSelect_Click(object sender, EventArgs e)
    {
        this.label1.ResetText();
        try
        {
            using (DbConnection conn = this.GetConnection())
            {
                DataTable dt = new DataTable("郑州大学新闻信息");
                dt.Columns.Add("Title", typeof(String)).ExtendedProperties["FieldUnique"] = true;
                dt.Columns.Add("PubDepartment", typeof(String));            DataRow row = dt.NewRow();
                row["Title"] = "新闻标题1";
                row["PubDepartment"] = "发布单位";
                dt.Rows.Add(row);            row = dt.NewRow();
                row["Title"] = "新闻标题2";
                row["PubDepartment"] = "sdfasdfsdf";
                dt.Rows.Add(row);            row = dt.NewRow();
                row["Title"] = "新闻标题3";
                row["PubDepartment"] = "发布单位";
                dt.Rows.Add(row);            DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = this.textBox2.Text;
                cmd.CommandType = CommandType.StoredProcedure;            conn.Open();
                
                this.DeriveParameters(cmd);                                foreach (DataRow r in dt.Rows)
                {
                    
                    cmd.Parameters["@Title"].Value = r["Title"];
                    cmd.Parameters["@PubDepartment"].Value = r["PubDepartment"];
                    cmd.ExecuteNonQuery();
                }
            }    }
        catch (NoAnyColumnFoundException)
        {
            this.label1.Text = "在数据库中找不到任何匹配的字段。";
        }
        catch (Exception ex)
        {
           this.label1.Text = ex.Message;
        }}
      

  5.   

    wht6411兄:你先看一下OdbcCommandBuilder.DeriveParameters用法就知道了.http://www.eggheadcafe.com/forums/ForumPost.asp?ID=64400&INTID=1
    估计是个BUG,这个老外和我的问题一样.用2.0,偶遇到两个BUG了, 还有这个也是:
    http://community.csdn.net/Expert/topic/4707/4707944.xml?temp=.6145288
      

  6.   

    问题是用DeriveParameters已经得到参数了, 可以在调试中看出来, 参数很正常, 就是还提示缺少参数, 真是SB透顶!!!
      

  7.   

    又有新发现, 不是OdbcCommandBuilder.DeriveParameters问题, 就是手工添加参数, 也同样不行, 谁不信自己试试!!!! 现在想解决问题就是找一个用OdbcCommand调用存储过程的例子就行了, 看有没有成功的!!!private void btnSelect_Click(object sender, EventArgs e)
    {
        this.label1.ResetText();
        try
        {
            using (DbConnection conn = this.GetConnection())
            {
                DataTable dt = new DataTable("郑州大学新闻信息");
                dt.Columns.Add("Title", typeof(String)).ExtendedProperties["FieldUnique"] = true;
                dt.Columns.Add("PubDepartment", typeof(String));            DataRow row = dt.NewRow();
                row["Title"] = "新闻标题1";
                row["PubDepartment"] = "发布单位";
                dt.Rows.Add(row);            row = dt.NewRow();
                row["Title"] = "新闻标题2";
                row["PubDepartment"] = "sdfasdfsdf";
                dt.Rows.Add(row);            row = dt.NewRow();
                row["Title"] = "新闻标题3";
                row["PubDepartment"] = "发布单位";
                dt.Rows.Add(row);            DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = this.textBox2.Text;
                cmd.CommandType = CommandType.StoredProcedure;            conn.Open();
                
                //this.DeriveParameters(cmd);
                
                // **************************
                //
                //    显视添加参数也不行!!!
                //
                // **************************
                DbParameter p = cmd.CreateParameter();
                p.ParameterName = "@Title";
                cmd.Parameters.Add(p);            DbParameter p2 = cmd.CreateParameter();
                p2.ParameterName = "@PubDepartment";
                cmd.Parameters.Add(p2);            foreach (DataRow r in dt.Rows)
                {
                    
                    cmd.Parameters["@Title"].Value = r["Title"];
                    cmd.Parameters["@PubDepartment"].Value = r["PubDepartment"];
                    cmd.ExecuteNonQuery();
                }
            }    }
        catch (NoAnyColumnFoundException)
        {
            this.label1.Text = "在数据库中找不到任何匹配的字段。";
        }
        catch (Exception ex)
        {
           this.label1.Text = ex.Message;
        }}