我正在使用的数据库是Progress OpenEdge。在我的程序中,我要获取数千个序列号,并在数据库中查询与其相关的信息。
下面的代码基本上需要约6000个序列号,并为每个序列号创建一个选择查询,并返回包含字符串的列表。
/// <summary>
/// Builds a list of queries for each serial number in param<c>sn</c>
/// </summary>
/// <param name="sn">A list of valid serial numbers</param>
/// <returns>A list of strings where each string is a sql query for a serial number's information</returns>
private static List<string> BuildQuery(List<string> sn)
{
return sn.Select(s => "SELECT a.\"Date-Created\", a.\"date-produced\", a.employee, " +
"a.\"Item-Code\", a.\"job-number\", a.\"station-produced\", " +
"a.\"shift-produced\", a.\"Serial-Number\", a.\"parent-serial\", " +
"a.\"gross-wgt\", a.\"qty-base\", a.\"resin-wgt\", " +
"a.\"tare-wgt\", a.\"Integer-1\", a.\"unit-number\" FROM " +
$"CUSTOM10.PUB.\"imsngsnt\" a WHERE a.\"Serial-Number\" = '{s}'").ToList();
}
然后我遍历列表调用此函数约6000次。
/// <summary>
/// Makes a query to the given connection <c>conn</c> and query <c>sql</c> and returns the information for the serial number <c>sn</c>
/// </summary>
/// <param name="conn">Connection to SNT database</param>
/// <param name="sql">SQL query</param>
/// <param name="sn">The serial number the query pertains to</param>
/// <returns><c>SerialInformation</c> containing the information for Serial number <c>sn</c></returns>
private static SerialInformation MakeQuery(OdbcConnection conn, string sql, string sn)
{
var set = new DataSet();
// Perform all queries
var adapter = new OdbcDataAdapter(sql, conn);
adapter.Fill(set);
if (set.Tables[0].Rows.Count == 0) return null;
var info = ConvertDataSet(set);
// Add starting serial number to info
info.StartingSerial = sn;
return info;
}
我知道这是非常低效的,我想知道如何使用.NET System.Data.ODBC使这些查询更快。
答案 0 :(得分:1)
如果允许您在数据库中创建表,请创建表:
CREATE TABLE search_serial_numbers (
"Serial-Number" INTEGER
-- or is it VARCHAR(n)?
-- EXACT SAME TYPE AS "Serial-Number" in the
-- CUSTOM10.PUB."imsngsnt" table!
);
然后,在一次SQLExecute()调用中,将〜6000行的数组插入到search_serial_numbers
表中。
然后转到-(我将在普通SQL中编写该代码,根据需要从C#中连接字符串):
SELECT
a."Date-Created"
, a."date-produced"
, a.employee
, a."Item-Code"
, a."job-number"
, a."station-produced"
, a."shift-produced"
, a."Serial-Number"
, a."parent-serial"
, a."gross-wgt"
, a."qty-base"
, a."resin-wgt"
, a."tare-wgt"
, a."Integer-1"
, a."unit-number"
FROM CUSTOM10.PUB."imsngsnt" a
INNER JOIN search_serial_number b
on a."Serial-Number" = b."Serial-Number"
;