Update mongodb

This commit is contained in:
sunkaixuan
2025-05-02 14:54:14 +08:00
parent d287455502
commit 52f20ee74c
3 changed files with 62 additions and 60 deletions

View File

@@ -78,30 +78,38 @@ namespace MongoDb.Ado.data
var rows = dt.Rows;
using (DbDataReader dr = command.ExecuteReader())
{
for (int i = 0; i < dr.FieldCount; i++)
if (dr.Read())
{
string name = dr.GetName(i).Trim();
if (!columns.Contains(name))
columns.Add(new DataColumn(name, dr.GetFieldType(i)));
else
for (int i = 0; i < dr.FieldCount; i++)
{
columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
string name = dr.GetName(i).Trim();
if (!columns.Contains(name))
columns.Add(new DataColumn(name, dr.GetFieldType(i)));
else
{
columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
}
}
}
while (dr.Read())
{
DataRow daRow = dt.NewRow();
for (int i = 0; i < columns.Count; i++)
AddRow(dt, columns, dr);
while (dr.Read())
{
daRow[columns[i].ColumnName] = dr.GetValue(i);
AddRow(dt, columns, dr);
}
dt.Rows.Add(daRow);
}
}
dt.AcceptChanges();
}
private static void AddRow(DataTable dt, DataColumnCollection columns, DbDataReader dr)
{
DataRow daRow = dt.NewRow();
for (int i = 0; i < columns.Count; i++)
{
daRow[columns[i].ColumnName] = dr.GetValue(i);
}
dt.Rows.Add(daRow);
}
/// <summary>
/// Fill
/// </summary>
@@ -112,13 +120,13 @@ namespace MongoDb.Ado.data
{
ds = new DataSet();
}
var dt = new DataTable();
using (DbDataReader dr = command.ExecuteReader())
{
do
var columns = dt.Columns;
var rows = dt.Rows;
if (dr.Read())
{
var dt = new DataTable();
var columns = dt.Columns;
var rows = dt.Rows;
for (int i = 0; i < dr.FieldCount; i++)
{
string name = dr.GetName(i).Trim();
@@ -129,19 +137,13 @@ namespace MongoDb.Ado.data
columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
}
}
AddRow(dt, columns, dr);
while (dr.Read())
{
DataRow daRow = dt.NewRow();
for (int i = 0; i < columns.Count; i++)
{
daRow[columns[i].ColumnName] = dr.GetValue(i);
}
dt.Rows.Add(daRow);
AddRow(dt, columns, dr);
}
dt.AcceptChanges();
ds.Tables.Add(dt);
} while (dr.NextResult());
}
ds.Tables.Add(dt);
}
}

View File

@@ -13,36 +13,9 @@ namespace MongoDb.Ado.data
{
private readonly IEnumerator<BsonDocument> _enumerator;
private BsonDocument _current;
private List<string> _fieldNames;
private List<Type> _fieldTypes;
public MongoDbBsonDocumentDataReader(IEnumerable<BsonDocument> documents)
{
var docList = documents.Take(1).ToList();
_enumerator = docList.GetEnumerator();
if (docList.Any()==true)
{
_fieldNames = docList.SelectMany(d => d.Names).Distinct(StringComparer.OrdinalIgnoreCase).ToList();
_fieldTypes = new List<Type>();
foreach (var fieldName in _fieldNames)
{
Type fieldType = typeof(object); // 默认类型
foreach (var doc in docList)
{
if (doc.TryGetValue(fieldName, out var value) && value != BsonNull.Value)
{
fieldType = BsonTypeMapper.MapToDotNetValue(value)?.GetType() ?? typeof(object);
}
break;
}
_fieldTypes.Add(fieldType);
}
}
else
{
_fieldNames = new List<string>();
_fieldTypes = new List<Type>();
}
_enumerator = documents.GetEnumerator();
}
public override bool Read()
@@ -55,7 +28,7 @@ namespace MongoDb.Ado.data
return false;
}
public override int FieldCount => _fieldNames.Count;
public override int FieldCount => _current?.Count()??0;
public override int Depth => throw new NotImplementedException();
@@ -77,7 +50,12 @@ namespace MongoDb.Ado.data
public override DateTime GetDateTime(int ordinal) => (DateTime)GetValue(ordinal);
public override decimal GetDecimal(int ordinal) => (decimal)GetValue(ordinal);
public override double GetDouble(int ordinal) => (double)GetValue(ordinal);
public override Type GetFieldType(int ordinal) => _fieldTypes[ordinal] ?? typeof(object);
public override Type GetFieldType(int ordinal)
{
var obj = GetValue(ordinal);
if (obj == null) return typeof(object);
return obj.GetType();
}
public override float GetFloat(int ordinal) => (float)GetValue(ordinal);
public override Guid GetGuid(int ordinal) => (Guid)GetValue(ordinal);
public override short GetInt16(int ordinal) => (short)GetValue(ordinal);
@@ -102,9 +80,18 @@ namespace MongoDb.Ado.data
public override string GetName(int ordinal)
{
if (ordinal < 0 || ordinal >= _fieldNames.Count)
if (_current == null)
throw new InvalidOperationException("No current document.");
// 获取当前文档的字段元素列表Elements
var elements = _current.Elements.ToList();
// 确保 ordinal 是有效的索引
if (ordinal < 0 || ordinal >= elements.Count)
throw new IndexOutOfRangeException($"Invalid ordinal: {ordinal}");
return _fieldNames[ordinal];
// 返回对应索引的字段名
return elements[ordinal].Name;
}
public override int GetOrdinal(string name)

View File

@@ -119,6 +119,7 @@ namespace MongoDbTest
private static void DataTableTest()
{
//datatable
{
var connection = new MongoDbConnection(DbHelper.SqlSugarConnectionString);
connection.Open();
@@ -130,6 +131,18 @@ namespace MongoDbTest
mongoDbDataAdapter.Fill(dt);
connection.Close();
}
//dataset
{
var connection = new MongoDbConnection(DbHelper.SqlSugarConnectionString);
connection.Open();
////SELECT * FROM b ORDER BY age DESC OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY;
MongoDbCommand mongoDbCommand = new MongoDbCommand(" aggregate b [\r\n { \"$sort\": { \"age\": -1 } },\r\n { \"$skip\": 1 },\r\n { \"$limit\": 2 }\r\n] ]", connection);
MongoDbDataAdapter mongoDbDataAdapter = new MongoDbDataAdapter();
mongoDbDataAdapter.SelectCommand = mongoDbCommand;
DataSet ds = new DataSet();
mongoDbDataAdapter.Fill(ds);
connection.Close();
}
}
private static void ExecuteScalarTest()
{