【问题标题】:C# Error, Executing Stored Procedure, Stored Procedure is not availableC# 错误,执行存储过程,存储过程不可用
【发布时间】:2013-04-12 18:19:29
【问题描述】:

我有一个问题,我的 MySQL 数据库中有一个名为 sp_insertSupplier 的存储过程。此方法在mysql数据库中执行时有效。

我在保存按钮中使用了这个语法

private void btn_supplier_save_Click(object sender, EventArgs e)
{
    string connections = Connection.mysqlconnectionbuilder();
    using (MySqlConnection conn = new MySqlConnection(connections))
    {
        using (MySqlCommand cmd = new MySqlCommand()) 
        {
            //make connection
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP);";
            cmd.Parameters.AddWithValue("@KD", createCode()); 
            cmd.Parameters.AddWithValue("@NM", txtsuppliernama.Text); 
            cmd.Parameters.AddWithValue("@AL", txtsupplieralamat.Text); 
            cmd.Parameters.AddWithValue("@EM", txtsupplieremail.Text); 
            cmd.Parameters.AddWithValue("@TLP",txtsuppliernotelp.Text);
            try
            {
                conn.Open();
                int result = cmd.ExecuteNonQuery();
                //check the result status
                if (result.Equals(1))
                {
                    DialogResult results = MessageBox.Show("Data berhasil ditambahkan! \n Apakah anda ingin input data lainnya? ", "Sukses!", MessageBoxButtons.OKCancel);
                    //cek apabila ingin menambahkan data lagi.
                    if (results.Equals(DialogResult.OK))
                    {
                        reset();
                    }
                    else if (results.Equals(DialogResult.Cancel))
                    {
                        this.Close();
                    }
                }
            } //end TRY
            catch (Exception exe)
                {
                    MessageBox.Show("Terjadi Kesalahan", "Perhatian!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    StreamWriter _writer = new StreamWriter("E899911823.log");
                    _writer.WriteLine(exe.ToString());
                    Console.WriteLine(exe.ToString());
                } //END CATCH
            finally 
                {
                    conn.Clone();
                } //END FINALLY
        }
    }
}

但是,当我执行语法时,它显示一个错误:

MySql.Data.MySqlClient.MySqlException (0x80004005): Procedure or function '`call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP)`' cannot be found in database XXXXX

我认为连接管理器或创建@KD 的随机方法没有任何问题。

我还是有同样的问题,控制台显示:

MySql.Data.MySqlClient.MySqlException (0x80004005): Procedure or function '`call sp_insertSupplier`' cannot be found in database '`XXXXX`'.
at MySql.Data.MySqlClient.ProcedureCache.GetProcData(MySqlConnection connection, String spName)
at MySql.Data.MySqlClient.ProcedureCache.AddNew(MySqlConnection connection, String spName)
at MySql.Data.MySqlClient.ProcedureCache.GetProcedure(MySqlConnection conn, String spName, String cacheKey)
at MySql.Data.MySqlClient.StoredProcedure.GetParameters(String procName, DataTable& proceduresTable, DataTable& parametersTable)
at MySql.Data.MySqlClient.StoredProcedure.CheckParameters(String spName)
at MySql.Data.MySqlClient.StoredProcedure.Resolve(Boolean preparing)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
at SerbaManisInventory.SupplierAdd.btn_supplier_save_Click(Object sender, EventArgs e)

我只是重写代码,使代码如下:

using (MySqlCommand cmd = new MySqlCommand()) 
{
    cmd.Connection = conn;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "call sp_insertSupplier";
    cmd.Parameters.AddWithValue("@KD", createCode()); 
    cmd.Parameters.AddWithValue("@NM", txtsuppliernama.Text);
    cmd.Parameters.AddWithValue("@AL", txtsupplieralamat.Text); 
    cmd.Parameters.AddWithValue("@EM", txtsupplieremail.Text);
    cmd.Parameters.AddWithValue("@TLP",txtsuppliernotelp.Text); 
    try
        {
            ...

【问题讨论】:

    标签: c# mysql stored-procedures


    【解决方案1】:
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP);";
    

    如果CommandTypeStoredProcedure,则无需编写所有内容。随便写:

    cmd.CommandText = "sp_insertSupplier";
    

    并像你一样提供参数。

    确实没有名为call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP);的过程/函数

    【讨论】:

    • 删除这个call 。写sp_insertSupplier
    • 哎呀,我忘了那个“电话”:D感谢您的帮助伙伴!那就玩得开心吧!现在工作。
    【解决方案2】:

    只需在CommandText中写下存储过程的名称

      cmd.CommandText = "sp_insertSupplier";
    

    在您编写 CommandText 的方式中,您强制提供程序搜索名称由“call sp_insertSupplier ......”组成的存储过程,显然没有具有该名称的过程

    【讨论】:

    • 问题依然存在。哪些可能性会导致此错误?
    • 从堆栈跟踪中,您在存储过程的真实姓名前仍然有“调用”一词。请勿在 sp 名称前后放置任何内容
    【解决方案3】:

    只需在commandText中写入存储过程的名称即可 cmd.CommandText = "sp_insertSupplier";你不需要“呼叫”部分

    【讨论】:

      【解决方案4】:

      确保您的数据库名称在您的连接字符串中全部使用小写字母!我也遇到了这个错误,并通过使用this bug report 将我的数据库名称更改为所有小写字母来解决它。似乎这种行为不依赖于目标系统类型。

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2017-07-20
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多