Я создаю решение VS и использую BIML, я создал уровни и файлы кода на c #.Когда я запускаю каждый отдельный biml-файл, они компилируют и генерируют выходные данные в программе просмотра.Когда я проверяю ошибки, он выдает эту ошибку. «Столбец двоичного типа должен указывать положительную длину или -1 для представления значения MAX.
В одном из моих файлов кода c # я делаю оператор case для типа данныхпереключиться на типы данных SQL. В этой кодовой странице я указываю, что длина двоичного столбца равна -1, но я все еще получаю сообщение об ошибке. Любая помощь будет оценена.
Я попытался изменить -1 на10, а также 1, но все равно появляется та же ошибка.
DataRow.cs СОДЕРЖАНИЕ ФАЙЛА
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Varigence.Biml.Extensions;
public static class DataRow
{
public static string GetBiml(this System.Data.DataRow dataRow)
{
StringBuilder biml = new StringBuilder("");
biml.Append("<Column Name=\"")
.Append(dataRow["ColumnName"])
.Append("\" DataType=\"")
.Append(dataRow["DataTypeBiml"])
.Append("\"");
if (dataRow["DataTypeBiml"].ToString().Contains("String"))
biml.Append(" Length=\"").Append(dataRow["CharLength"]).Append("\"");
else if (dataRow["DataTypeBiml"] == "Decimal")
biml.Append(" Precision=\"").Append(dataRow["NumericPrecision"]).Append("\" Scale=\"").Append(dataRow["NumericScale"]).Append("\"");
else if (dataRow["DataTypeBiml"] == "Binary")
biml.Append(" Length=\"-1 \" ");
if (dataRow["IsNullable"] != "NO")
biml.Append(" IsNullable=\"true\"");
else
biml.Append(" IsNullable=\"false\"");
biml.Append(" />");
return biml.ToString();
}
}
1-ReadMetaData.biml
<#@ template tier="10" #>
<#@ import namespace="System.Data"#>
<#@ import namespace="System.Data.SqlClient"#>
<#@ code file="Helper.cs" #>
<#@ code file="DataRow.cs" #>
<#
string targetConnection = @"Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=SSPI;";
#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Tables>
<#
var sourceTables = Helper.GetIncludedSourceTablesList();
// Loop through each source table in the included source tables list
foreach (Table sourceTable in sourceTables)
{
#>
<Table Name="<#=sourceTable.Name#>" SchemaName="schema">
<#
string targetQuery = @"SELECT OrdinalPosition = col.ORDINAL_POSITION,
ColumnName = col.COLUMN_NAME,
DataType = col.DATA_TYPE,
CharLength = ISNULL(col.CHARACTER_MAXIMUM_LENGTH, 0),
NumericPrecision = col.NUMERIC_PRECISION,
NumericScale = col.NUMERIC_SCALE,
IsNullable = col.IS_NULLABLE,
DataTypeBiml = CASE col.DATA_TYPE
WHEN 'bigint' THEN 'Int64'
WHEN 'bit' THEN 'Boolean'
WHEN 'char' THEN 'AnsiStringFixedLength'
WHEN 'datetime' THEN 'DateTime'
WHEN 'decimal' THEN 'Decimal'
WHEN 'float' THEN 'Double'
WHEN 'int' THEN 'Int32'
WHEN 'nchar' THEN 'StringFixedLength'
WHEN 'nvarchar' THEN 'String'
WHEN 'smallint' THEN 'Int16'
WHEN 'timestamp' THEN 'Binary'
WHEN 'tinyint' THEN 'Byte'
WHEN 'varchar' THEN 'AnsiString'
WHEN 'uniqueidentifier' THEN 'Guid'
ELSE 'Unknown'
END
FROM (
SELECT lkup.TABLE_SCHEMA,
lkup.TABLE_NAME,
ORDINAL_POSITION_MAX = MAX(lkup.ORDINAL_POSITION)
FROM INFORMATION_SCHEMA.COLUMNS AS lkup
WHERE lkup.TABLE_SCHEMA = 'dbo'
AND lkup.TABLE_NAME = '" + sourceTable.Name + @"'
GROUP BY lkup.TABLE_SCHEMA,
lkup.TABLE_NAME
) AS maxord
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS col ON (maxord.TABLE_SCHEMA = col.TABLE_SCHEMA
AND maxord.TABLE_NAME = col.TABLE_NAME)
ORDER BY col.ORDINAL_POSITION;";
DataTable targetTable = new DataTable();
SqlDataAdapter targetAdapter = new SqlDataAdapter(targetQuery,targetConnection);
targetAdapter.Fill(targetTable);
#>
<Columns>
<# foreach (DataRow targetRow in targetTable.Rows) {#>
<#=targetRow.GetBiml()#>
<# } #>
</Columns>
</Table>
<# } #>
</Tables>
</Biml>
TableList.cs СОДЕРЖАНИЕ ФАЙЛА
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Varigence.Biml.Extensions;
public class Helper
{
public static List<Table> GetIncludedSourceTablesList()
{
var tablesList = new List<Table>
{
new Table() { Name = "Tab1"},
new Table() { Name = "Tab2" },
new Table() { Name = "Tab3" },
new Table() { Name = "Tab4" },
new Table() { Name = "Tab5" },
new Table() { Name = "Tab6" }
};
return tablesList;
}
}
public class Table
{
public string Name { get; set; }
}
это часть вывода в средстве просмотра файла ReadMetaData.biml, которая не помещает длину в двоичный столбец
<Column Name="RowVers" DataType="Binary" IsNullable="true" />