我有一些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;
型
这两个查询都可以返回我期望的数据,但我遇到的问题是引用列表或字典值。无论是列表还是字典-它不一定是两者,但只是包括他们的情况下,任何人都建议这两个是更可取的。
如有任何帮助,我们将不胜感激。
1条答案
按热度按时间vmpqdwk31#
你不能很容易地将一个列表从C#传递到Oracle(因为,出于某种未知的原因,C#只支持Oracle PL/SQL关联数组,它不能在SQL语句中使用,并且不支持传递Oracle SQL集合,它可以在SQL语句中使用)。即使你可以这样做,你可能也不想这样做,因为传递集合是一个相对昂贵的操作。虽然您可以使用字符串连接来构建
IN
表达式列表,但这被认为是不好的做法,因为它会使您的语句容易受到SQL注入攻击。使用
OUTER JOIN
并在单个SQL语句中同时查询T1
和T2
,然后稍后填充字典将更简单(也更高效):字符串
如果你的数据在不同的服务器上,那么你可以在它们之间建立一个数据库链接。
在C#中:
DeptRef
与前一行的DeptRef
不同,则将其添加到列表和字典中。DeptName2
不是NULL
,则在其上执行需要执行的任何处理。