Oracle ORA-01008:未绑定所有变量(在带有参数化查询的表适配器中)

Oracle ORA-01008:未绑定所有变量(在带有参数化查询的表适配器中),oracle,visual-studio,parameters,datatable,tableadapter,Oracle,Visual Studio,Parameters,Datatable,Tableadapter,环境: Visual Studio 2010(.NET FrameWork 4) ASP.NET web应用程序 Oracle数据库 使用System.Data.OracleClient 我有一个web表单,用户可以在与我的查询中的每个参数对应的文本框中输入任何数据或不输入任何数据。如果用户未输入任何数据,文本框将获得“0”值 我的问题是: SELECT "CardNo" , "Name" FROM CSC.CommercialCardList

环境:

  • Visual Studio 2010(.NET FrameWork 4)

  • ASP.NET web应用程序

  • Oracle数据库

  • 使用System.Data.OracleClient

    我有一个web表单,用户可以在与我的查询中的每个参数对应的文本框中输入任何数据或不输入任何数据。如果用户未输入任何数据,文本框将获得“0”值

我的问题是:

SELECT "CardNo" , "Name"
FROM CSC.CommercialCardList
WHERE("CardNo"=:CardNo or :CardNo=0) and ("Name"=:Name or :Name=0)
当我在MYDATABASE.xsd面板中右键单击TableAdapter中的查询,并选择“预览数据”并用“0”填充参数值时,我得到错误(“ORA-01008:未绑定所有变量”)

有人能帮我吗

--编辑--


您需要绑定4个变量作为代码的一部分

2表示“CardNo”=:CardNo或:CardNo=0


2对于“Name”=:Name或:Name=0,必须将命令BindByName设置为true:

1-在OracleCommand中,如下所示

 OracleCommand cmd = new OracleCommand();
2-在TableAdapter中,如下所示,并使用真值调用SetBindByName

namespace MyTableAdapters
{
    public partial class MyTabTableAdapter
    {
        public bool SetBindByName
        {
            set
            {
                this.Adapter.InsertCommand.BindByName = value;
                this.Adapter.UpdateCommand.BindByName = value;
                this.Adapter.DeleteCommand.BindByName = value;
                foreach (Oracle.DataAccess.Client.OracleCommand cmd in this.CommandCollection)
                {
                    cmd.BindByName = value;
                }
            }
        }
    }
}

我使用了CardNo=(CardNoTextBox.Text!=String.Empty)?文本:“0”;你是说另一个:CardNo??可能只满足于“CardNo”=:CardNo不是:CardNo=0我认为这不对。如果在SQL中声明了两次
:CardNo
,它仍然是一个绑定变量。我想他只需要两个绑定变量。你能展示你的代码吗?不是SQL,而是VB/C#?CardNo=(CardNoTextBox.Text!=String.Empty)?文本:“0”;Name=(NameTextBox.Text!=String.Empty)?名称文本框。文本:“0”;商业卡列表。填写(dt、卡号、名称);ds.Tables.Add(dt);您还可以在实际与Oracle服务器对话的位置添加代码吗?它应该有一个
OracleCommand
对象。。。
namespace MyTableAdapters
{
    public partial class MyTabTableAdapter
    {
        public bool SetBindByName
        {
            set
            {
                this.Adapter.InsertCommand.BindByName = value;
                this.Adapter.UpdateCommand.BindByName = value;
                this.Adapter.DeleteCommand.BindByName = value;
                foreach (Oracle.DataAccess.Client.OracleCommand cmd in this.CommandCollection)
                {
                    cmd.BindByName = value;
                }
            }
        }
    }
}