字符串构建每1025个字符注入一个换行符或东西 - 弄乱我的sqlCommand

时间:2014-12-09 05:08:25

标签: c# string

我正在构建SqlCommand字符串,为DataWarehouse项目动态构建SQL表。我得到列名,列类型和适当的参数来完成该行并连接到previous。每隔1025个字符一个换行符或其他东西正由C#注入,它使得该行看起来如下所示:(注意\nDiagnost被打破到另一行。应该是\nDiagnosticResultsConfirmedByF200IEN)真的搞砸{SQLCommand 1}}并且无效。

\nDeepIncisionalSsi varchar(500) NULL,
\nDesiredProcedureDate Date NULL,
\nDeviceS varchar(70) NULL,
\nDiabetes varchar(500) NULL,
\nDiabetesCardiac varchar(500) NULL,
\nDiabetesMellitusChronic varchar(500) NULL,
\nDiabetesMellitusPreopMgmt varchar(500) NULL,
\nDiagnost
    icResultsConfirmByF200IEN varchar(50) NULL,
\nDiagnosticTherapeuticYN varchar(500) NULL,
\nDictatedSummaryExpected varchar(500) NULL,
\nDischargedViaF131x01IEN varchar(50) NULL,
\nDischargeTransferDate

变量为SqLColumns,此表的总长度为1025 x 21。这是我们最宽的SQL表之一,有近1200列。

有谁知道为什么C#会这样做?有没有办法解决它而不将create table语句破坏为1200 ALTER TABLE命令?

创建SqlColumns的代码:

string sqlColumns = "";

 foreach (DataRowView row in dv)
            {
                // code to add columns to create table statement
                switch (row["DWFieldDataType"].ToString())
                {
                    case "varchar":
                        sqlColumns = sqlColumns + '\n' + row["DWFieldName"] + " varchar(" + row["DWFieldLength"] + ") NULL,";
                        break;
                    case "Date":
                        sqlColumns = sqlColumns + '\n' + row["DWFieldName"] + " Date NULL," ;
                        break;
                    case "numeric":
                        sqlColumns = sqlColumns + '\n' + row["DWFieldName"] + " numeric(" + row["DWFieldLength"] + "," + row["DWFieldScale"] + ") NULL," ;
                        break;
                    case "":
                        if (row["DataDomain"].ToString() == "PKIEN")
                        {
                            if (row["DWFieldName"].ToString() != dwTN+"IEN".ToString())
                                sqlPKColumns = sqlPKColumns + '\n' + row["DWFieldName"] + " varchar(50) NULL,";
                            sqlPK = sqlPK + row["DWFieldName"] + "  ASC ,";
                        }
                        break;
                    case "DateTime":
                        sqlColumns = sqlColumns + '\n' + row["DWFieldName"] + " DateTime NULL," ;
                        break;
                    case "int":
                        sqlColumns = sqlColumns + '\n' + row["DWFieldName"] + " int NULL," ;
                        break;
                    default:
                        //Code
                        break;
                }
            }
            sqlColumns = sqlPKColumns + sqlColumns + '\n' + "OpCode [char](1) NULL," + '\n' + "VistaCreateDate datetime NOT NULL," + '\n' + "VistaEditDate datetime NOT NULL" + '\n';

4 个答案:

答案 0 :(得分:3)

我认为你被记事本本身愚弄了。即使取消选中扭曲字,记事本也会以1025个字符的形式断行。

Visual Studio的Text Visualizer也存在同样的问题。窗口左下方有一个“Wrap”选项,但即使取消选中它,也不会再进一步​​列出1025列。

但是,它只是一个显示问题 - 您的字符串实际上不包含任何换行符。如果将结果粘贴到实际的文本编辑器(如Notepad ++)中,甚至粘贴到Visual Studio的代码视口中,您将看到所有文本都适合单行。

答案 1 :(得分:1)

我怀疑C#是否导致了这个问题。我想这是因为你试图用\n(NewLine)字符追加字符串。请改用StringBuilder及其AppendLine方法。

这是和示例

     StringBuilder sqlColumns = new StringBuilder();

        foreach (DataRowView row in dv)
        {
            // code to add columns to create table statement
            switch (row["DWFieldDataType"].ToString())
            {
                case "varchar":
                    sqlColumns.AppendLine(row["DWFieldName"] + " varchar(" + row["DWFieldLength"] + ") NULL,");
                    break;
                case "Date":
                    sqlColumns.AppendLine(row["DWFieldName"] + " Date NULL,");
                    break;
                case "numeric":
                    sqlColumns.AppendLine(row["DWFieldName"] + " numeric(" + row["DWFieldLength"] + "," + row["DWFieldScale"] + ") NULL,");
                    break;

//继续使用“字符串”构建器,如上所示

然后使用sqlColumns.ToString(),您可以获得最终字符串。

希望这有助于解决问题。

答案 2 :(得分:1)

每当我必须在我的代码中放入一个长字符串时,我通常将其烘焙到自己的文本文件中,并附加add作为资源。所以我也可以给这个文件一个很好的文件扩展名(在你的情况下是.sql),如果我在visual studio中打开这个文件,我也会得到语法高亮,大大提高了可读性。如果我在这个文件中只需要一个或两个参数,我将使用简单的String.Format(),或者如果它变得复杂,则使用.FormatWith() method。即使你的文本结果中有更大的动态块,你也应该考虑将所有这些块放到他们自己的文件中,并且在你的代码中简单地引用资源字符串。

所有这些都有助于提高文本的可读性和使用它的代码。但是,在你的例子中仍然存在这个神秘的错误。所以我从你自己的答案中复制了字符串(即使它不是一个答案,应该是你的问题的编辑)并完全按照你的意思完成(用同样的方法创建一个test2;从两者中创建一个test3)。我让所有三个字符串写入磁盘,然后手动一起手动复制前两个文件。这个手动方法我保存为test4文件,并对test3和test4文件进行了字节比较。结果:它们是二进制相等的。

答案 3 :(得分:0)

在另一个论坛中,用户建议我的测试/验证技术可能存在缺陷,并且即时窗口可能是注射的来源。他建议我尝试将字符串写入文件,我做了但无法复制。因此,我认为即时窗口是注射源,但它并没有解决最初的问题。

我回到绘图板并替换了所有'\ n'和& '\ r \ n'带有Environment.NewLine的文字并重新运行。问题没有再次出现。所以我猜那些暗示这个问题与那些文字有关的人可能是对的。

我也喜欢这里给出的建议,以调整写入文件的永久策略,并调用文件生成表格,因为它提供了历史记录。

 using (StreamWriter sw = File.CreateText(@"d:\SQLScripts\textfile.txt"))
            {
                sw.Write(test3);
            }

在尝试使用StringBuilder的建议后,我按照建议更改了代码,而StringBuilder做了完全相同的事情。话虽如此,我认为在我的情况下,我有很多连接,我相信StringBuilder将是一个更好的策略,因为我已经解决了潜在的问题。

谢谢大家的意见。