gpt4 book ai didi

c# - SqlDataAdapter.Fill 和 SqlDataReader.Read 的结果不一致

转载 作者:行者123 更新时间:2023-11-29 22:21:12 26 4
gpt4 key购买 nike

我有一个 SQL 数据库,其中包含我想要读入 DataTable 对象的各种表。为此,我使用了 SqlDataAdapter.Fill,它对除一个名为“Problems”的表之外的所有表都运行良好。在此表上,该方法运行时不会引发任何异常,但生成的 DataTable 最终仅包含 3,321 行,而 SQL 表有 9,800 行。我的“问题”表的代码与其他表的代码相同:

adapter.SelectCommand = new SqlCommand("SELECT * FROM [Problems]", my_connection);
adapter.Fill(my_dataset, "Problems");

我监听了adapter.FillError 和adapter.RowUpdated 错误状态,但什么也没捕获。所以我决定使用 SqlDataReader 按顺序读取表(代码如下)。这工作得很好,并获取了完整的 9,800 行。这让我担心使用 SqlDataAdapter.Fill 可能会丢失其他表的数据,因此我概括了为 SqlDataReader 编写的方法,让我可以按顺序读取任何表(代码也在下面)。但是当我尝试使用这种通用方法时,我再次只得到 3,321 行!

我希望能够将 SQL 数据库读入 DataTables,而不必担心丢失数据。

顺序读取“问题”的代码(这是实际有效的代码):

    public static DataTable GetAllProblems()
{
DataTable table = new DataTable("Problems");

table.Columns.Add(new DataColumn("ExerciseID", typeof(int)));
table.Columns.Add(new DataColumn("ParentID", typeof(int)));
table.Columns.Add(new DataColumn("AnswerFields", typeof(string)));

table.PrimaryKey = new DataColumn[] { table.Columns[0] };

DataRow dr;

SqlCommand com = new SqlCommand("SELECT * FROM [Problems]", ProblemDBPortConnection());
if (com == null) throw new Exception("WTF");

string a;
int ex_id, parent_id;

com.Connection.Open();
SqlDataReader rdr = com.ExecuteReader();
while(rdr.Read())
{
dr = table.NewRow();
a = rdr["Answers"].ToString();
ex_id = (int)rdr["ExerciseID"];

parent_id = -1;
if (!DBNull.Value.Equals(rdr["ParentID"])) parent_id = (int)rdr["ParentID"];

dr["ExerciseID"] = ex_id;
dr["ParentID"] = parent_id;
dr["AnswerFields"] = ProblemAnswerFields(a);
table.Rows.Add(dr);
}

rdr.Close();
com.Connection.Close();

return table;
}

接下来是上述方法的概括,在“问题”表上,该方法似乎以与 SqlDataAdapter.Fill 方法相同的偷偷摸摸的方式失败。在我的代码中,我通过

调用该方法
my_dataset.Tables.Add(GetTable("Problems", "SELECT * FROM [Problems]", new Tuple<string, Type>("ExerciseID", typeof(int)), new Tuple<string, Type>("ParentID", typeof(int)), new Tuple<string, Type>("AnswerFields", typeof(string))));

方法本身是

    public static DataTable GetTable(string tableName, string selectCommand, params Tuple<string, Type>[] fields)
{
SqlCommand com = new SqlCommand(selectCommand, ProblemDBConnection());
if(com==null)
throw new Exception("WTF");

if(fields.Length == 0)
throw new Exception("WTF");

DataTable table = new DataTable(tableName);
DataColumn dc;
for(int i=0; i<fields.Length; i++)
{
if(fields[i].Item2 == typeof(string))
dc = new DataColumn(fields[i].Item1, typeof(string));
else
{
if(fields[i].Item2 != typeof(int))
throw new Exception("WTF");
dc = new DataColumn(fields[i].Item1, typeof(int));
}

table.Columns.Add(dc);
}

table.PrimaryKey = new DataColumn[] {table.Columns[0]};

com.Connection.Open();
SqlDataReader rdr = com.ExecuteReader();
DataRow dr;
while (rdr.Read())
{
dr = table.NewRow();

for (int i = 0; i < fields.Length; i++)
{
if (fields[i].Item1 == "AnswerFields")
{
if (DBNull.Value.Equals(rdr["Answers"]))
dr[fields[i].Item1] = "";
else
dr[fields[i].Item1] = ProblemAnswerFields(rdr["Answers"].ToString());
}
else if (DBNull.Value.Equals(rdr[fields[i].Item1]))
{
if (fields[i].Item2 == typeof(string))
dr[fields[i].Item1] = "";
else
{
dr[fields[i].Item1] = -1;
}
}
else
{
if (fields[i].Item2 == typeof(string))
dr[fields[i].Item1] = rdr[fields[i].Item1].ToString();
else
{
dr[fields[i].Item1] = (int)rdr[fields[i].Item1];
}
}
}

table.Rows.Add(dr);
}

rdr.Close();
com.Connection.Close();

return table;
}

最佳答案

没关系,事实证明我在失败的情况下不小心使用了旧连接,该连接从已弃用的数据库版本中提取了所有数据。 >< 看来我不太聪明。

关于c# - SqlDataAdapter.Fill 和 SqlDataReader.Read 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com