mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-20 02:29:39 +08:00
Update mongodb
This commit is contained in:
@@ -77,6 +77,8 @@ namespace MongoDb.Ado.data
|
||||
var columns = dt.Columns;
|
||||
var rows = dt.Rows;
|
||||
using (DbDataReader dr = command.ExecuteReader())
|
||||
{
|
||||
if (dr.Read())
|
||||
{
|
||||
for (int i = 0; i < dr.FieldCount; i++)
|
||||
{
|
||||
@@ -88,8 +90,17 @@ namespace MongoDb.Ado.data
|
||||
columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
|
||||
}
|
||||
}
|
||||
|
||||
AddRow(dt, columns, dr);
|
||||
while (dr.Read())
|
||||
{
|
||||
AddRow(dt, columns, dr);
|
||||
}
|
||||
}
|
||||
}
|
||||
dt.AcceptChanges();
|
||||
}
|
||||
|
||||
private static void AddRow(DataTable dt, DataColumnCollection columns, DbDataReader dr)
|
||||
{
|
||||
DataRow daRow = dt.NewRow();
|
||||
for (int i = 0; i < columns.Count; i++)
|
||||
@@ -98,9 +109,6 @@ namespace MongoDb.Ado.data
|
||||
}
|
||||
dt.Rows.Add(daRow);
|
||||
}
|
||||
}
|
||||
dt.AcceptChanges();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fill
|
||||
@@ -112,13 +120,13 @@ namespace MongoDb.Ado.data
|
||||
{
|
||||
ds = new DataSet();
|
||||
}
|
||||
var dt = new DataTable();
|
||||
using (DbDataReader dr = command.ExecuteReader())
|
||||
{
|
||||
do
|
||||
{
|
||||
var dt = new DataTable();
|
||||
var columns = dt.Columns;
|
||||
var rows = dt.Rows;
|
||||
if (dr.Read())
|
||||
{
|
||||
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);
|
||||
AddRow(dt, columns, dr);
|
||||
}
|
||||
dt.Rows.Add(daRow);
|
||||
}
|
||||
dt.AcceptChanges();
|
||||
ds.Tables.Add(dt);
|
||||
} while (dr.NextResult());
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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()
|
||||
{
|
||||
|
Reference in New Issue
Block a user