1

我正在开发一个对 Oracle 进行数据访问的 C# 解决方案。

并希望有一个关于查询的通用解决方案。

这是我的代码的一部分:

public DataTable GetData(string query)
{
    DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OracleClient");

    using (DbConnection conn = factory.CreateConnection())
    {
        try
        {
            DbConnectionStringBuilder csb = factory.CreateConnectionStringBuilder();
            csb["Data Source"] = @"Northwind";
            csb["User Id"] = @"Northwind";
            csb["Password"] = @"Northwind";

            conn.ConnectionString = csb.ConnectionString;
            conn.Open();

            using (DbCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = query;

                using (DataTable dt = new DataTable())
                {
                    DbDataAdapter da = factory.CreateDataAdapter();
                    cmd.CommandType = CommandType.Text;
                    da.SelectCommand = cmd;
                    da.Fill(dt);
                    return dt;
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Error", ex);
        }
        finally
        {
            if (conn.State != ConnectionState.Closed)
                conn.Close();
        }
    }
}

我这样称呼我的方法:

DataAccess.Provider data = new DataAccess.Provider();
DataTabel dt = dt.GetData("select * from myTable);

这很好用,但这不是我的目标。

CL_mpg我的所有 SQL 查询都调用了第二个类。

class CL_MPG
{
    public string rq_sql;

    public string selectParam(string param)
    {
        this.rq_sql = "select * from myTable where id = '" + param + "';";
        return this.rq_sql;
    }

    public string select()
    {
        this.rq_sql = "select * from myTable";
        return this.rq_sql;
    }

    //...

}

而且我想使用我的方法selectParam和/或select填充我的数据表,但我不知道该怎么做。

4

1 回答 1

0

尽管其他人抱怨您的学习尝试,但每个人都必须从某个地方开始。您的方法实际上是一个好的开始,但我会将参数从字符串更改为 DbCommand 对象。然后,您可以创建方法来正确构建命令并设置正确的参数。然后将整个准备好的命令传递给您的包装器方法(创建连接、测试打开成功、查询数据等)并让您的方法返回一个 DataTable 对象,就像您拥有的那样......类似于

public class CL_MPG
{
   private DataTable GetData(DbCommand cmd )
   {   
      // do all the same as you have with exception of your USING DBCOMMAND.
      // just set the connection property of the incoming command to that of
      // your connection created
      // AT THIS PART -- 
      // using (DbCommand cmd = conn.CreateCommand())
      // {
      //    cmd.CommandText = query;
      // just change to below and remove the closing curly bracket for using dbcommand
      cmd.Connection = conn;
   }

   // Now, your generic methods that you want to expose for querying
   // something like
   public DataTable GetAllData()
   {
      DbCommand cmd = new DbCommand( "select * from YourTable" );
      return GetData( cmd );
   }

   public DataTable GetUser( int someIDParameter )
   {
      DbCommand cmd = new DbCommand( "select * from YourTable where ID = @parmID" );
      cmd.Parameters.Add( "@parmID", someIDParameter );
      return GetData( cmd );
   }

   public DataTable FindByLastName( string someIDParameter )
   {
      DbCommand cmd = new DbCommand( "select * from YourTable where LastName like @parmTest" );
      cmd.Parameters.Add( "@parmTest", someIDParameter );
      return GetData( cmd );
   }
}

请注意,该命令正在构建中,并且正在完全准备和参数化与字符串的连接,因为先前的注释可能会使您暴露于 SQL 注入。至于参数,而不是查询Oracle,可能需要对其进行一些调整。不同的引擎使用略有不同的约定。如果连接到 SQL-Server 数据库,它使用“@”来标识参数。在 SyBase Advantage 数据库中,它使用“:”。使用 Visual FoxPro,一个简单的“?” 使用占位符。

此外,如果您的查询有许多条件,只需继续添加额外的“@parm”类型占位符,然后按照它们在查询中出现的顺序添加参数,以确保您没有遗漏任何内容。根据您的需要,某些功能可能没有,一个或多个。然后,在提供的示例中,它就像做类似的事情一样简单

DataTable whoIs = yourCL_MPGObject.GetUser( 23 );
if( whoIs.Rows.Count > 0 )
   MessageBox.Show( whoIs.Rows[0]["WhateverColumnName"] );
于 2013-11-27T11:51:53.763 回答