Files
DP44/DataPRO/UnitTest/DatabaseUnitTesting/Utilities/Results/ResultSetParser.cs

84 lines
3.0 KiB
C#
Raw Normal View History

2026-04-17 14:55:32 -04:00
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
namespace DatabaseUnitTesting.Utilities.Results
{
internal static class ResultSetParser
{
private const int NAME = 0;
private const int WIDTH = 2;
private const int PRECISION = 3;
private const int SCALE = 4;
private const int TYPE = 24;
internal static Database Parse(SqlCommand command)
{
using (SqlDataReader sqlReader = command.ExecuteReader())
{
Database results = new Database();
if (!sqlReader.HasRows)
return results;
do
{
Table table = new Table("Result Set");
List<string> fieldNames = SetFields(table, sqlReader.GetSchemaTable());
while (sqlReader.Read())
{
Row row = new Row("datarow");
for (int i = 0; i < sqlReader.FieldCount; i++)
{
object value = sqlReader.GetValue(i);
if (!(value is DBNull))
row.AddColumn(new Column(fieldNames[i], sqlReader.GetValue(i)));
}
table.AddRow(row);
}
results.AddTable(table);
} while (sqlReader.NextResult());
return results;
}
}
internal static List<string> SetFields(Table table, DataTable schema)
{
List<string> fieldNames = new List<string>();
foreach (DataRow dataRow in schema.Rows)
{
string name = dataRow[NAME].ToString();
string type = dataRow[TYPE].ToString().ToLower();
string precision = dataRow[PRECISION].ToString();
string scale = dataRow[SCALE].ToString();
string width = dataRow[WIDTH].ToString();
StringBuilder typeString = new StringBuilder(type);
if (type.Equals("decimal") || type.Equals("numeric"))
{
typeString.Append("(");
typeString.Append(precision);
typeString.Append(",");
typeString.Append(scale);
typeString.Append(")");
}
else if (type.Contains("char") || type.Contains("binary"))
{
if (int.Parse(width) > 8000)
width = "max";
typeString.Append("(");
typeString.Append(width);
typeString.Append(")");
}
fieldNames.Add(name);
table.AddField(name, typeString.ToString());
}
return fieldNames;
}
}
}