使用Delphi中的ADO将NULL插入到SQL Server 2000中。

3

我正在尝试利用Delphi 2007中的ADO将数据插入SQL Server 2000数据库。

目前为止,我已经写了如下代码:

insert into (a,b)
select :a,:b

qry.parameters.parambyname('a').value := '';
qry.parameters.parambyname('b').value := '';

我收到的错误是:

不允许从数据类型text隐式转换为数据类型nvarchar...使用convert函数来运行此查询。

表中的列允许NULL值。
我想要的是,SQL Server表在值为''时显示NULL。我该如何实现?

1
你的字段和参数类型是什么?为什么在想要插入 null 时将参数设置为空字符串?空字符串和 null 不是同一回事。 - user743382
1
http://docwiki.embarcadero.com/Libraries/en/System.Variants.Null - RBA
我指的是 field.DataTypeparameter.DataType 的值。 - user743382
5
你的 insert 语法有点奇怪… 你试过这样吗:insert into your_table_name(a, b) values(:a,:b)? 而且 qry.parameters.parambyname('a').value := Null 应该完全没问题。 - kobik
3
@Joe,“但我还想知道另外一件事......” 这是一个全新的问题,无法通过评论来回答。 - kobik
显示剩余8条评论
8个回答

2

你可以用这些行来替换

qry.parameters.parambyname('a').value := Null;
qry.parameters.parambyname('b').value := Null;

1

加入用途 --> 变量;

然后您可以将其替换为以下行:

qry.parameters.parambyname('a').value := Null;
qry.parameters.parambyname('b').value := Null;

1

尝试

qry.parameters.parambyname('a').Clear;


1

不要写 null,应该写成 nil

<TAdoDataSet>.FieldByName('a').AsVariant:= Nil; 

1
qry.parameters.parambyname('a').value := unassigned;

我尝试了这个,但是出现了错误:“参数对象定义不正确。提供的信息不一致或不完整。” - Joe

1

尝试使用:

qry.parameters.parambyname('a').value := Null;
qry.parameters.parambyname('b').value := Null;

或者

根本不设置参数 - 默认情况下,参数被设置为“Null”。

Null是一种特殊类型的Variant(使用Variants),它定义了一个空值(没有类型)。


我尝试了这个,但是出现了错误“参数对象定义不正确。提供的信息不一致或不完整。” - Joe

1
qry.parameters.parambyname('a').AsVariant:= Null; 

必须是

<TAdoDataSet>.FieldByName('a').AsVariant:= Null;

未声明的标识符 AsVariant。 - Joe
是的,没错。我忽略了属性。它必须是 'FieldByName'。 - Ravaut123

0
使用ADOQuery,为您的表编写一个“Select”。我经常使用它。
Select * From MyTable Where 0=1

双击ADOquery组件。将出现字段列表窗口。添加所有字段(右键单击)。这样,您就可以在Delphi代码中使用您的字段。

MyTable.Open;
MyTable.Append;
MyTableAFieldFromMyTable.AsInteger := 0;
MyTableAStringFieldFromMyTable.AsString := 'Hello, World';
MyTable.Post;

说到你的问题:

MyTableAnotherFieldFromMyTable.Clear;

将值设置为 NULL,就像我们在 SQL Server 中知道的那样。 编辑:我刚刚检查了一段工作代码。我在以下代码中清除表中的 Video 字段。

Ornek.Open;
Ornek.Edit;
OrnekVideo.Clear;

查询语句只是 "select * from Ornek Where 0=1",我使用字段的 .AsInteger、.AsString 等属性在 Delphi 代码中进行赋值。


我刚刚检查了一些我自己的工作代码,发现存在一个名为clear的方法。你是不是刚刚添加了字段并使用了字段的方法?我的意思是不涉及表格或参数,只需编写一个选择语句,然后编写Delphi代码来填充字段值,而不是编写插入语句到查询组件中。ADO会自动创建一个插入查询。 - Celal Ergün
也许我的情况不同,如果我检查类,它会显示TCustomADODataSet。抱歉,但我有点新手。 - Joe
你应该使用 TADOQuery。它足够聪明,可以从 Select 查询中创建 Delete 和 Insert 查询,并且这个过程对程序员来说是完全透明的。 - Celal Ergün

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接