字符串构建每 1025 个字符注入一个换行符或其他东西 - 弄乱了我的 sqlCommand
本文关键字:其他 sqlCommand 我的 乱了 换行符 一个 1025 构建 字符 注入 字符串 | 更新日期: 2023-09-27 18:33:34
我正在构建SqlCommand字符串,该字符串为DataWarehouse项目动态构建SQL表。 我得到列名、列类型和适当的参数来完成该行并连接到上一个。 C# 每 1025 个字符注入一个换行符或其他内容,使该行如下所示:(请注意'nDiagnost
被断开到另一行。 应该'nDiagnosticResultsConfirmedByF200IEN
(真的搞砸了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
,在此表上,总长度为 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';
我认为你被记事本本身愚弄了。即使您取消选中扭曲单词,记事本也会在 1025 个字符处换行。
Visual Studio的文本可视化工具也有同样的问题。窗口左下角有一个"包装"选项,但即使您取消选中它,它也不会进一步增加 1025 列。
但是,这只是一个显示问题 - 您的字符串实际上不包含任何换行符。如果将结果粘贴到实际的文本编辑器(如记事本++(中,甚至是 Visual Studio 的代码视口中,您将看到所有文本都将适合一行。
我怀疑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()
您可以获得最终字符串。
希望这有助于解决问题。
每当我必须在代码中放入一个长字符串时,我通常会将其烘焙到自己的文本文件中,并附加 add 作为资源。所以我也可以给这个文件一个很好的文件扩展名(在你的情况下.sql(,如果我在Visual Studio中打开这个文件,我也会得到语法高亮,这大大提高了可读性。如果我只需要这个文件中的一两个参数,我将使用简单的String.Format()
或者如果它变得复杂,请使用.FormatWith()
方法。即使文本结果中有较大的动态块,您也应该考虑将所有这些块放入它们自己的文件中,并在代码中简单地引用资源字符串。
所有这些都将有助于提高文本和使用它的代码的可读性。但是,在您的示例中仍然有这个神秘的错误在摇摆不定。所以我从你自己的答案中复制了字符串(即使它不是答案,应该是对你的问题的编辑(,并完全按照你的意思做了(创建一个相同的test2;从两者中创建一个test3(。我让所有三个字符串写到磁盘,然后手动将前两个文件手动复制到一起。这种手动方法我保存为 test4 文件,并对 test3 和 test4 文件进行了字节比较。结果:它们是二进制相等的。
在另一个论坛中,一位用户表示我的测试/验证技术可能存在缺陷,即时窗口可能是注射的来源。 他建议我尝试将字符串写入文件,我做到了,但无法复制。 所以我相信即时窗口是注射的来源,但是,它并没有解决最初的问题。
我回到绘图板,将所有"'"和"''r'"文本替换为 Environment.NewLine 并重新运行。 问题没有再次出现。 所以我想那些认为这个问题与这些文字有关的人可能是对的。
我也喜欢这里给出的建议,以适应写入文件并调用文件以生成表的永久策略,因为它提供了历史记录。
using (StreamWriter sw = File.CreateText(@"d:'SQLScripts'textfile.txt"))
{
sw.Write(test3);
}
在建议尝试StringBuilder之后,我按照建议更改了代码,StringBuilder做了完全相同的事情。 话虽如此,我认为在我的情况下,我有很多连接,我相信StringBuilder将是一个更好的策略,因为我已经解决了根本问题。
谢谢大家的评论。