Sim*_*mon 3 c# sql-server-2008
我正在编写一个实用程序C#,将包含大约80列的大型CSV导入SQL Server 2008表.
CSV需要在导入之前进行操作,例如合并某些列,转换日期等.因此,我正在构建一个INSERT INTO语句,如下所示:
INSERT INTO table VALUES ('abc','blah',...)
Run Code Online (Sandbox Code Playgroud)
我的问题是该表包含一个类型的列UNIQUEINDENTIFIER.这是一个问题因为我想重新使用一个现有的方法,该方法接受一组值并返回值的字符串直接弹出到我的INSERT INTO语句中,其中包含撇号,注入攻击等.
有没有一种方法可以生成一个有效的文字UNIQUEIDENTIFIER,我可以传递给这个方法?我试过Guid.NewGuid.ToString(),它给了我一个像这样的文字'bfdb0297-2018-4555-ac12-88064944a671',但我的查询然后错误与数据截断异常.我也尝试删除连字符.我希望32个十六进制字符可以工作.
我知道参数化查询是正确的方法,但这意味着现有代码的重要工作.
我非常擅长使用C#而且非常适合使用SQL Server.
[编辑]
我做了几件事.首先,写了一个查询,用Guid.NewGuid更新该列是有效的.因此,截断错误不是从那里.检查SQL Server引用使我相信不会从id列中的错误值返回截断错误,而是一个无效的值错误.我还考虑到了Aaron的评论,即重要的工作不是没有正确行事的借口,并且已经创建了一种生成参数化查询的方法,该方法现在工作正常.
非常感谢所有响应者.
SQL Server中的文字UNIQUEIDENTIFIER如下所示:
SELECT {guid'8DEC377B-6D75-424B-AE01-D3727993C7F6'}
Run Code Online (Sandbox Code Playgroud)
如文档中所示:
它是由关键字
GUID后跟十六进制数字形成的序列,称为注册表格式:8-4-4-4-12 用单引号括起来.
似乎没有人知道这一点.这是我见过的第一种实际上有文字GUID/UUID的语言.
由于这工作正常:
DECLARE @x TABLE(y UNIQUEIDENTIFIER);
INSERT @x SELECT 'bfdb0297-2018-4555-ac12-88064944a671';
Run Code Online (Sandbox Code Playgroud)
这会失败并显示您当前收到的通用错误消息:
DECLARE @x TABLE
(
y UNIQUEIDENTIFIER,
z CHAR(10)
);
INSERT @x
SELECT 'bfdb0297-2018-4555-ac12-88064944a671',
'0123456789A';
Run Code Online (Sandbox Code Playgroud)
结果:
消息 8152,级别 16,状态 14,第 7 行
字符串或二进制数据将被截断。
该语句已终止。
我不得不怀疑错误是否真的发生在UNIQUEIDENTIFIER列上。我怀疑(a)错误发生在表中的不同列上,并且您尚未验证所有字符串长度,或者(b)表上有一个触发器并且错误发生在那里。
如果您使用正确的参数而不是仅仅将字符串放在一起,则可以确保每个参数的定义与表中的完全相同。