二进制类型 -1 的列表示最大值



我正在构建一个VS解决方案并使用BIML,我已经创建了层和c#代码文件。当我运行每个单独的 biml 文件时,它们会在查看器中编译并生成输出。当我检查错误时,它会抛出此错误"二进制类型的列必须指定正长度或 -1 来表示 MAX 值。

在我的一个 c# 代码文件中,我正在对数据类型执行 case 语句以切换到 SQL 数据类型。在此代码页中,我指定二进制列的长度为 -1,但仍然收到错误。任何帮助将不胜感激。

我尝试将 -1 更改为 10 和 1,但仍然收到相同的错误。

数据行.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>

表列表.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" />

查看您的代码,它可能很简单,就像您在 -1 之后有一个尾随空格一样简单,这可能会丢弃 Length 属性,因为它具有无效值:

所以这个:

biml.Append(" Length="-1 " ");

应该变成这样:

biml.Append(" Length="-1" ");

我想通了错误,我没有将 DataTypeBiml 转换为字符串来比较它,一旦我这样做了,长度就正确放出来了。

else if (dataRow["DataTypeBiml"].ToString() == "Binary")
        biml.Append(" Length="-1"");

感谢您的建议

最新更新