Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# string build每隔1025个字符注入一个换行符或其他内容,这会弄乱我的sqlCommand_C#_String - Fatal编程技术网

C# string build每隔1025个字符注入一个换行符或其他内容,这会弄乱我的sqlCommand

C# string build每隔1025个字符注入一个换行符或其他内容,这会弄乱我的sqlCommand,c#,string,C#,String,我正在构建SqlCommand字符串,用于为数据仓库项目动态构建SQL表。我得到列名、列类型和适当的参数来完成这一行并连接到上一行。每1025个字符,C将注入一个换行符或其他内容,使该行看起来如下:(注意\nDiagnost被打断到另一行。应该是\nDiagnosticresultsConfigedByF200IEN)确实会弄乱SQLCommand,并且无效 \nDeepIncisionalSsi varchar(500) NULL, \nDesiredProcedureDate Date NU

我正在构建SqlCommand字符串,用于为数据仓库项目动态构建SQL表。我得到列名、列类型和适当的参数来完成这一行并连接到上一行。每1025个字符,C将注入一个换行符或其他内容,使该行看起来如下:(注意
\nDiagnost
被打断到另一行。应该是
\nDiagnosticresultsConfigedByF200IEN
)确实会弄乱
SQLCommand
,并且无效

\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
,此表上的总长度为
1025x21
。这是我们最宽的SQL表之一,有近1200列

有人知道C#为什么会这样做吗?有没有办法在不将CREATETABLE语句分解为1200个
ALTERTABLE
命令的情况下解决这个问题

创建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';
我怀疑
C#
是问题的根源。我想这是因为您试图在字符串后面附加
\n
(换行符)字符。使用
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()
可以获得最终字符串

希望这有助于解决问题。

我怀疑
C#
是问题的根源。我想这是因为您试图在字符串后面附加
\n
(换行符)字符。使用
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()
可以获得最终字符串


希望这有助于解决问题。

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

我回到绘图板,用Environment.NewLine替换所有“\n”和“\r\n”文本,然后重新运行。问题没有再次出现。所以我想那些认为这个问题与这些文字有关的人可能是对的

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

 using (StreamWriter sw = File.CreateText(@"d:\SQLScripts\textfile.txt"))
            {
                sw.Write(test3);
            }
在提出尝试StringBuilder的建议后,我按照建议修改了代码,StringBuilder也做了同样的事情。话虽如此,我认为在我有许多连接的情况下,我相信StringBuilder将是一个更好的策略,因为我已经解决了根本问题


谢谢大家的评论。

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

我回到绘图板,用Environment.NewLine替换所有“\n”和“\r\n”文本,然后重新运行。问题没有再次出现。所以我想那些认为这个问题与这些文字有关的人可能是对的

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

 using (StreamWriter sw = File.CreateText(@"d:\SQLScripts\textfile.txt"))
            {
                sw.Write(test3);
            }
在提出尝试StringBuilder的建议后,我按照建议修改了代码,StringBuilder也做了同样的事情。话虽如此,我认为在我有许多连接的情况下,我相信StringBuilder将是一个更好的策略,因为我已经解决了根本问题


谢谢大家的评论。

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


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

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