1

我正在尝试制作一个允许我将趋势存储在 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();

有什么建议么?

4

4 回答 4

1

将 Counter 列更改为 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))
{
  ...
}
于 2012-05-02T03:00:10.253 回答
1

如果您使用的是 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.*;

我在这里使用了一个输出子句,只是为了说明它在做什么。多次执行合并语句,看看输出如何变化。如果您感觉很活泼,请将其包装在一个带有两个参数(标签和计数器)的存储过程中,这样您就会得到一些不错的东西。享受!

于 2012-05-02T16:45:52.523 回答
0

要添加到 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 + '")"
于 2012-05-02T03:03:10.210 回答
0

You can use Parameters to avoid sql injection :

   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();
于 2012-05-02T03:13:51.140 回答