oracle 从列表或字典中的数据库和搜索值中选择 *

r55awzrz  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(128)

我有一些C#代码,在其中查询Oracle数据库表(我们称之为T1)和SQL Server数据库表(我们称之为T2),并将来自T1的数据放入字典和列表(我可以使用任何一个)。我只是将T1中的deptRef添加到字典/列表中。
我试图实现的是检查来自T2的数据是否存在于我使用的SELECT语句中的字典OR列表中。

SELECT deptRef, deptName 
FROM T2 
WHERE deptRef IN List

字符串
到目前为止,我有这个:

string strDeptName = "";
string strDeptRef = "";

string connstring = Convert.ToString(Dts.Variables["$Project::ORACLEConnectionString"].Value);
var sql = "SELECT d_reference AS DeptRef, d_name AS DeptName FROM T1 ORDER BY 1 ASC";

OleDbConnection t1con;
t1con = new OleDbConnection(connstring);

DataSet _ds = new DataSet();
DataTable _dt = new DataTable();

t1con.Open();
OleDbCommand cmd = new OleDbCommand(sql, t1con);
cmd.Connection = t1con;
cmd.CommandType = CommandType.Text;
        
OleDbDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
    strDeptRef = dr.GetString(0).ToString();
    strDeptName = dr.GetString(1);
    
    // ADD TO LIST
    List<string> T1DeptsList = new List<string>();

    foreach (string dept in T1DeptsList)
    {
        T1DeptsList.Add(dept);
    }
            
    // Add to DICTIONARY
    Dictionary<string, int> T1DeptsDict = new Dictionary<string, int>();

    int ii = 0;
    T1DeptsDict.Add(strDeptRef, ii);
    ii++;
}
        
// This is the second query
var sqlcon = Convert.ToString(Dts.Variables["$Project::SQLConnectionString"].Value);
         
OleDbConnection mwconnstring;
sqlconnstring = new OleDbConnection(sqlcon);
sqlconnstring.Open();

var mwsql = @"SELECT d_name FROM T2 WHERE d_reference IN T1DeptsList or T1DeptsDict....."; //this is the part where I'd like to query the List/Dictionary

OleDbCommand cmd2 = new OleDbCommand(mwsql, sqlconnstring);
cmd2.Connection = sqlconnstring;
cmd2.CommandText = mwsql;
cmd2.CommandType = System.Data.CommandType.Text;


这两个查询都可以返回我期望的数据,但我遇到的问题是引用列表或字典值。无论是列表还是字典-它不一定是两者,但只是包括他们的情况下,任何人都建议这两个是更可取的。
如有任何帮助,我们将不胜感激。

vmpqdwk3

vmpqdwk31#

你不能很容易地将一个列表从C#传递到Oracle(因为,出于某种未知的原因,C#只支持Oracle PL/SQL关联数组,它不能在SQL语句中使用,并且不支持传递Oracle SQL集合,它可以在SQL语句中使用)。即使你可以这样做,你可能也不想这样做,因为传递集合是一个相对昂贵的操作。虽然您可以使用字符串连接来构建IN表达式列表,但这被认为是不好的做法,因为它会使您的语句容易受到SQL注入攻击。
使用OUTER JOIN并在单个SQL语句中同时查询T1T2,然后稍后填充字典将更简单(也更高效):

SELECT t1.d_reference as DeptRef,
       t1.d_name as DeptName,
       t2.d_name AS DeptName2
FROM   T1
       LEFT OUTER JOIN T2
       ON t1.d_reference = t2.d_reference
ORDER BY t1.d_reference ASC

字符串
如果你的数据在不同的服务器上,那么你可以在它们之间建立一个数据库链接。
在C#中:

  • 对于每行:
  • 如果DeptRef与前一行的DeptRef不同,则将其添加到列表和字典中。
  • 如果DeptName2不是NULL,则在其上执行需要执行的任何处理。
  • 注意:你还没有描述你想要实现的逻辑,但是你应该在循环之外创建一次列表和字典,然后在循环内添加到它,而不是在每个循环中创建一个新的列表和字典,覆盖以前的值。

相关问题