如何使用asp.net C#基于用户输入查询Oracle数据库 [英] how to query oracle database based on user input using asp.net c#

查看:369
本文介绍了如何使用asp.net C#基于用户输入查询Oracle数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我面临的问题,当我尝试根据用户输入查询Oracle数据库和数据中填写xml格式显示。
在这里,我写我的code: -

 使用System.Data.OracleClient的;[的WebMethod]
公共字符串CallCardDetails(字符串CallCardNo)
{
     //初始化
     DataSet的DS =新的DataSet();     //连接
     使用(康涅狄格州的OracleConnection =新的OracleConnection(用户ID = ORADB;密码= ORA;数据源= CCT))
     {
            &所述;≤(第1方法)GT;>
            查询字符串=从CallCardTable那里idcard =选择idcard:pCallCardNo            &所述;≤(第2方法)GT;>
            查询字符串=从CallCardTable那里idcard = @ CallCardNo选择idcard            CMD的OracleCommand =新的OracleCommand(查询,康涅狄格州);            cmd.CommandType = CommandType.Text;
            conn.Open();            &所述;≤(第1方法的参数 - )GT;>
            的OracleParameter pCallCardNo =新的OracleParameter();
            pCallCardNo.Value = CallCardNo;
            cmd.Parameters.Add(pCallCardNo);            &所述;≤(第二方法参数 - )GT;>
            cmd.Parameters.Add(@ CallCardNo,OracleType.VarChar).value的= CallCardNo;            OracleDataAdapter dA的=新OracleDataAdapter(查询,康涅狄格州);
            dA.Fill(DS);            cmd.Dispose();
            cmd.Parameters.Clear();
            dA.Dispose();
            conn.Close();
        }
        返回ds.GetXml(); }
<< 1例外>>
System.Data.OracleClient.OracleException:ORA-01008:不是所有的变量绑定在System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle,的Int32 RC)
在System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle,的CommandBehavior行为,布尔needRowid,OciRowidDescriptor&安培; rowidDescriptor,ArrayList的&安培; resultParameterOrdinals)
在System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle,的CommandBehavior行为的ArrayList和放大器; resultParameterOrdinals)
在System.Data.OracleClient.OracleCommand.ExecuteReader(的CommandBehavior行为)
在System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(的CommandBehavior行为)
在System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.FillInternal(数据集的数据集,数据表[]数据表,的Int32 startRecord用于,的Int32最大记录,字符串srcTable要,IDbCommand的命令的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.Fill(DataSet的数据集的Int32 startRecord用于,的Int32最大记录,字符串srcTable要,IDbCommand的命令的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.Fill(数据集数据集)<< 2例外>>
System.Data.OracleClient.OracleException:ORA-00936:缺少前pression在System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle,的Int32 RC)
在System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle,的CommandBehavior行为,布尔needRowid,OciRowidDescriptor&安培; rowidDescriptor,ArrayList的&安培; resultParameterOrdinals)
在System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle,的CommandBehavior行为的ArrayList和放大器; resultParameterOrdinals)
在System.Data.OracleClient.OracleCommand.ExecuteReader(的CommandBehavior行为)
在System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(的CommandBehavior行为)
在System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.FillInternal(数据集的数据集,数据表[]数据表,的Int32 startRecord用于,的Int32最大记录,字符串srcTable要,IDbCommand的命令的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.Fill(DataSet的数据集的Int32 startRecord用于,的Int32最大记录,字符串srcTable要,IDbCommand的命令的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.Fill(数据集数据集)

<< 3异常后遵循AVD答案>>
    System.Data.OracleClient.OracleException:ORA-01036:非法变量名/编号

 在System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle,的Int32 RC)
在System.Data.OracleClient.OracleParameterBinding.Bind(OciStatementHandle statementHandle,NativeBuffer parameterBuffer,为OracleConnection连接,布尔和放大器; mustRelease,SafeHandle的&安培; handleToBind)
在System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle,的CommandBehavior行为,布尔needRowid,OciRowidDescriptor&安培; rowidDescriptor,ArrayList的&安培; resultParameterOrdinals)
在System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle,的CommandBehavior行为的ArrayList和放大器; resultParameterOrdinals)
在System.Data.OracleClient.OracleCommand.ExecuteReader(的CommandBehavior行为)
在System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(的CommandBehavior行为)
在System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.FillInternal(数据集的数据集,数据表[]数据表,的Int32 startRecord用于,的Int32最大记录,字符串srcTable要,IDbCommand的命令的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.Fill(DataSet的数据集的Int32 startRecord用于,的Int32最大记录,字符串srcTable要,IDbCommand的命令的CommandBehavior行为)
在System.Data.Common.DbDataAdapter.Fill(数据集数据集)


解决方案

这应该工作:

 公共字符串CallCardDetails(字符串CallCardNo)
    {
        //初始化
        使用(DataSet的DS =新的DataSet())
        {
            //连接
            使用(康涅狄格州的OracleConnection =新的OracleConnection(用户ID = ORADB;密码= ORA;数据源= CCT))
            {
                // Oracle使用:为参数,而不是@
                查询字符串=从CallCardTable那里idcard =选择idcard:pCallCardNo                //让你的OracleCommand的使用块处置
                使用(CMD的OracleCommand =新的OracleCommand(查询,康涅狄格州))
                {
                    //注意:要小心AddWithValue:如果有的.NET数据类型之间的不匹配
                    // CallCardNo和idcard栏你可以有一个问题。投你所提供的价值
                    //这里无论是最接近你的数据库类型(字符串为VARCHAR2,日期为DATE,小数为号等)
                    cmd.Parameters.AddWithValue(:pCallCardNo,CallCardNo);
                    conn.Open();                    //再次,包装在使用或尝试使用/一次性捕获/最后(使用将在例外的情况下,处理的事情太多)
                    使用(OracleDataAdapter dA的=新OracleDataAdapter(CMD))
                    {
                        dA.Fill(DS);                        返回ds.GetXml();
                    }
                }
            }
        }
    }

编辑:周围使用DataSet中添加块

I am facing problem when I try to query oracle database based on user input and fill in dataset for displaying in xml format. Here I wrote my code :-

using System.Data.OracleClient;

[WebMethod]
public string CallCardDetails(string CallCardNo)
{
     //initialize
     DataSet ds = new DataSet();

     //connect
     using (OracleConnection conn = new OracleConnection("User Id=oraDB;Password=ora;Data Source=CCT"))
     {
            <<(1st method)>>
            string query = "SELECT idcard from CallCardTable where idcard= :pCallCardNo";                

            <<(2nd method)>>
            string query = "SELECT idcard from CallCardTable where idcard=@CallCardNo";

            OracleCommand cmd = new OracleCommand(query, conn);

            cmd.CommandType = CommandType.Text;
            conn.Open();

            <<(1st method parameter -)>>
            OracleParameter pCallCardNo = new OracleParameter();
            pCallCardNo.Value = CallCardNo;
            cmd.Parameters.Add(pCallCardNo);

            <<(2nd method parameter - )>>
            cmd.Parameters.Add("@CallCardNo", OracleType.VarChar).Value = CallCardNo;

            OracleDataAdapter dA = new OracleDataAdapter(query, conn);
            dA.Fill(ds);

            cmd.Dispose();
            cmd.Parameters.Clear();
            dA.Dispose();
            conn.Close();
        }
        return ds.GetXml();

 }


<<1st exception>>
System.Data.OracleClient.OracleException: ORA-01008: not all variables bound

at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

<<2nd exception>>
System.Data.OracleClient.OracleException: ORA-00936: missing expression

at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

<<3rd exception after follow the answer from AVD>> System.Data.OracleClient.OracleException: ORA-01036: illegal variable name/number

at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleParameterBinding.Bind(OciStatementHandle statementHandle, NativeBuffer parameterBuffer, OracleConnection connection, Boolean& mustRelease, SafeHandle& handleToBind)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

解决方案

This ought to work:

    public string CallCardDetails(string CallCardNo)
    {
        //initialize
        using (DataSet ds = new DataSet())
        {
            //connect
            using (OracleConnection conn = new OracleConnection("User Id=oraDB;Password=ora;Data Source=CCT"))
            {
                // Oracle uses : for parameters, not @
                string query = "SELECT idcard from CallCardTable where idcard= :pCallCardNo";

                // Let the using block dispose of your OracleCommand
                using (OracleCommand cmd = new OracleCommand(query, conn))
                {
                    // Note: be careful with AddWithValue: if there's a mismatch between the .NET datatype of
                    // CallCardNo and the idcard column you could have an issue.  Cast the value you provide
                    // here to whatever is closest to your database type (String for VARCHAR2, DateTime for DATE, Decimal for NUMBER, etc.)
                    cmd.Parameters.AddWithValue(":pCallCardNo", CallCardNo);
                    conn.Open();

                    // Again, wrap disposables in a using or use try/catch/finally (using will dispose of things in case of exceptions too)
                    using (OracleDataAdapter dA = new OracleDataAdapter(cmd))
                    {
                        dA.Fill(ds);

                        return ds.GetXml();
                    }
                }
            }
        }
    }

Edit: Added using block around the DataSet.

这篇关于如何使用asp.net C#基于用户输入查询Oracle数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆