【发布时间】:2020-02-26 06:31:40
【问题描述】:
我正在编写一个程序,我需要使用 SQL 将数据插入数据库。但是我意识到我需要使用验证来确保相同的 x.name 不会两次输入到数据库中。 (FormBoxes 是一个对象列表)代码需要从数据库中读取,而不是添加已经在 ID 列中的数据
【问题讨论】:
我正在编写一个程序,我需要使用 SQL 将数据插入数据库。但是我意识到我需要使用验证来确保相同的 x.name 不会两次输入到数据库中。 (FormBoxes 是一个对象列表)代码需要从数据库中读取,而不是添加已经在 ID 列中的数据
【问题讨论】:
我倾向于认为您希望始终避免在此列中出现重复,而不仅仅是针对这段特定的代码。如果是这样,我建议在该列上简单地创建一个唯一约束:
ALTER TABLE tblDate ADD CONSTRAINT ID_UNIQUE_CONSTRAINT UNIQUE (ID);
然后您的 RDBMS 将强制执行数据完整性(这是他们做得很好的事情)。如果您尝试插入重复项,您将收到一个特定错误,您可以在应用程序中捕获并处理该错误(在您的用例中,可能会忽略它)。
【讨论】:
请尝试这个,但建议您更改带有要索引的 ID 的表:
insert into tblDate (ID)
SELECT drvd1.tID FROM (
select @ID as tID) as drvd1 left join tblDate on ID=drvd1.tID
where tblDate.ID is NULL;
如果您的数据库不是 SQL Server,则无法使用以上,对于 MS Access,我已经创建了另一个
【讨论】:
对于 ms Access,您可以使用注释来执行此操作,至少您的 tblDate 中有 1 条记录:
insert into tblDate (ID)
SELECT myAlias.tID
FROM (SELECT top 1 @ID AS tID
FROM tblDate
union all
SELECT tblDate.ID
FROM tblDate
WHERE (((tblDate.ID)=@ID))) AS myAlias
GROUP BY myAlias.tID
HAVING (((Count(myAlias.tID))=1));
【讨论】:
您忘记了 Access 不注意命名参数。重要的是参数添加到参数集合的顺序。他们只是“?”要访问,所以我们需要 2 个参数都分配了相同的值。
Using...End Using 块将关闭并释放您的数据库对象。
不要使用.AddWithValue。见http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
还有一个:
https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
这是另一个
https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html
只在 For 循环之外创建一个命令,并且只填充一个参数集合。在循环内部只需更改参数的值。
Private Sub UpdateAccess()
Using cn As New OleDbConnection("Your connection string"),
cmd As New OleDbCommand("INSERT INTO tblDate (ID) VALUES (@ID) WHERE Not EXISTS(Select * FROM tblDate WHERE ID = @ID2)", cn)
cmd.Parameters.Add("@ID", OleDbType.Integer)
cmd.Parameters.Add("@ID2", OleDbType.Integer)
cn.Open()
For Each X In FormBoxes
cmd.Parameters("@ID").Value = X.Name
cmd.Parameters("@ID2").Value = X.Name
Next
End Using
End Sub
【讨论】:
'Missing ), ], or Item in query expression 'Not EXISTS(Select * FROM tblDate WHERE ID = @ID2
" 之前的@ID2 之后是否有右括号) ? ...= @ID2)"