【发布时间】:2010-09-29 09:24:31
【问题描述】:
我有一个要转换为 .net 的 VB6 应用程序。我分阶段执行此操作,因此客户端将同时拥有 VB6 和 .net 应用程序。应用程序的一部分将 ADO 2.8 COM 记录集缓存到 SQL Server 中的表中,并根据需要检索它们。 .net 应用程序使用相同的持久记录集。我有检索持久记录集并将其转换为数据集的 c# 代码。我的问题是——我是否以最有效的方式做这件事?
这是我从数据库中检索记录集的代码 --
Stream adoStream = null;
SqlParameter cmdParameter;
SqlCommand cmd = null;
SqlDataReader dr = null;
string cmdText;
int bytesReturned;
int chunkSize = 65536;
int offSet = 0;
UnicodeEncoding readBytes;
try
{
cmdParameter = new SqlParameter(parameterName, idParamter);
cmdText = sqlString;
cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 0;
cmd.CommandText = cmdText;
cmd.Connection = this.pbiSQLConnection;
cmd.Parameters.Add(cmdParameter);
dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
dr.Read();
if (dr.HasRows)
{
readBytes = new UnicodeEncoding();
byte[] byteChunk = new byte[chunkSize];
adoStream = new Stream();
adoStream.Type = StreamTypeEnum.adTypeText;
adoStream.Open(Type.Missing, ConnectModeEnum.adModeUnknown,
StreamOpenOptionsEnum.adOpenStreamUnspecified, "", "");
do
{
bytesReturned = (int)dr.GetBytes(0, offSet, byteChunk, 0,
chunkSize);
size += bytesReturned;
if (bytesReturned > 0)
{
if (bytesReturned < chunkSize)
{
Array.Resize(ref byteChunk, bytesReturned);
}
adoStream.WriteText(readBytes.GetString(byteChunk),
StreamWriteEnum.stWriteChar);
adoStream.Flush();
}
offSet += bytesReturned;
} while (bytesReturned == chunkSize);
}
}
catch (Exception exLoadResultsFromDB)
{
throw (exLoadResultsFromDB);
}
finally
{
if (dr != null)
{
if (!dr.IsClosed)
{
dr.Close();
}
dr.Dispose();
}
if (cmd != null)
{
cmd.Dispose();
}
}
这是将 ado 流转换为数据集的代码 --
adoStream = LoadTextFromDBToADODBStream(resultID, "@result_id",
"some sql statement", ref size);
if (adoStream.Size == 0)
{
success = false;
}
else
{
adoStream.Position = 0;
DataTable table = new DataTable();
Recordset rs = new Recordset();
rs.Open(adoStream, Type.Missing, CursorTypeEnum.adOpenStatic,
LockTypeEnum.adLockBatchOptimistic, -1);
if (adoStream != null)
{
adoStream.Close();
adoStream = null;
}
source.SourceRows = rs.RecordCount;
table.TableName = "Source";
source.Dataset = new DataSet();
source.Dataset.Tables.Add(table);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adapter.Fill(source.Dataset.Tables[0], rs);
if (adapter != null)
{
adapter.Dispose();
adapter = null;
}
if (adoStream != null)
{
adoStream.Close();
adoStream = null;
}
if (rs != null)
{
if (rs.State == 1)
{
rs.Close();
}
rs = null;
}
}
谢谢大家
编辑:我添加了一个赏金,看看是否有人可以使代码更高效。
【问题讨论】:
标签: c# vb6 performance