SQL 插入/计数器增量
本文关键字:计数器 插入 SQL | 更新日期: 2023-09-27 18:32:56
我正在尝试制作一个程序,允许我将趋势存储在SQL表中。如果尚不存在,我需要将输入到文本框中的主题标签添加到数据库中,然后将计数器递增 1。
第一列是"HashTag",第二列是"Counter",分别具有char(10)和int属性。
我是SQL的新手,所以它带来了一些问题。这就是我目前所拥有的。
SqlConnection connection = new SqlConnection();
connection.ConnectionString = (@"Data Source=.'SQLEXPRESS;AttachDbFilename=C:'Users'Jordan Moffat'Desktop'coursework'WindowsFormsApplication'WindowsFormsApplication'HashTags.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
connection.Open();
HashTagReader r = new HashTagReader();
if (r.HashTagSearch(s))
MessageBox.Show("I Found it!");
else
{
SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag, Counter) " + "Values (s, ++)", connection);
myCommand.ExecuteNonQuery();
}
connection.Close();
有什么建议吗?
将计数器列更改为 Identity(1,1),它将自动递增。 可以通过 SQL Management Studio 轻松执行此操作。
然后将查询更改为:
SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag) Values ('" + s + '")", connection);
注意:我相信SqlCommand继承自实现IDisposable的DbCommand。 您应该使用 using() 语句包装这些对象,就像清理任何非托管资源一样:
using(SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag) Values ('" + s + '")", connection))
{
...
}
如果您使用的是 SQL 2008+,则可以访问合并语句。 像这样:
CREATE TABLE #tmp
(
[HashTag] VARCHAR(10) NOT NULL ,
[Counter] INT NOT NULL
);
MERGE [#tmp] AS t
USING
(
SELECT [HashTag] ,
[Counter]
FROM ( VALUES ( '#kitties', 3) ) AS f ( [HashTag], [Counter] )
) AS s
ON t.[HashTag] = s.[HashTag]
WHEN NOT MATCHED BY TARGET
THEN
INSERT ( [HashTag], [Counter] )
VALUES
( s.[HashTag] ,
s.[Counter]
)
WHEN MATCHED
THEN
UPDATE
SET
t.[Counter] += s.[Counter]
OUTPUT
$ACTION ,
INSERTED.* ,
DELETED.*;
我在这里使用输出子句只是为了说明它在做什么。 多次执行 merge 语句,并查看输出如何变化。 如果你感觉很毛躁,把它包装在一个存储过程中,它有两个参数(hashtag和计数器),你就得到了一些很好的东西。 享受!
为了添加到 Chris 的答案中,为了避免重复插入,您应该(如果您使用的是 SQL Server 2005 或更高版本)向 HashTag 列添加一个唯一索引以强制执行限制。
然后在代码中,您应该使用 WHERE NOT EXISTS 子句。 请参阅此处:SQL Server 插入(如果不存在)最佳做法
所以你最终会得到:
"INSERT INTO tblHashTag (HashTag)
Values ('" + s + "')
WHERE NOT EXISTS (SELECT HashTag
FROM tblHashTag
WHERE HashTag = '" + s + '")"
您可以使用参数来避免 sql 注入:
string hashtag = "Your HashTagValue";
string counter = "Your Counter Value";
SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag, Counter) Values (@HashTag,@Counter)", connection);
myCommand.Parameters.Add("@HashTag", SqlDbType.varchar,50).Value = hashtag; //Your hashTagvalue
myCommand.Parameters.Add("@Counter", SqlDbType.varchar,50).Value = counter; //Your Counter Value
myCommand.ExecuteNonQuery();