Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL插入/计数器增量_C#_Sql Server_Insert - Fatal编程技术网

C# SQL插入/计数器增量

C# SQL插入/计数器增量,c#,sql-server,insert,C#,Sql Server,Insert,我正在尝试制作一个程序,允许我在SQL表中存储趋势。我需要将输入文本框的哈希标记添加到数据库中(如果它不存在),然后将计数器增加1 第一列是“HashTag”,第二列是“Counter”,分别具有char(10)和int属性 我是SQL新手,所以它带来了一点问题。这就是我目前所拥有的 SqlConnection connection = new SqlConnection(); connection.ConnectionString = (@"Data Source=.\SQLEXPRESS;A

我正在尝试制作一个程序,允许我在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),它将自动递增。您可以通过SQLManagementStudio轻松做到这一点

然后将查询更改为:

SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag) Values ('" + s + '")", connection); 
注意:我相信SqlCommand继承自DbCommand,后者实现IDisposable。您应该使用using()语句包装这些对象,以便清理任何非托管资源:

using(SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag) Values ('" + s + '")", connection))
{
  ...
}

要添加到Chris的答案中,为了避免重复插入,您应该(如果您使用的是SQL Server 2005或更高版本)在HashTag列中添加一个唯一的索引以强制执行该限制

然后在代码中应该使用WHERE NOT EXISTS子句。请看这里:

所以你会得到:

"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();

如果您使用的是SQL 2008+,则可以访问merge语句。大概是这样的:

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.*;

我在这里使用了一个output子句,只是为了说明它在做什么。多次执行merge语句,查看输出如何更改。如果您觉得很兴奋,可以将其封装在一个存储过程中,该存储过程包含两个参数(hashtag和counter),这样您就有了一些好东西。享受吧

好的,我现在正在下载SQL manager,所以我来看看这是怎么回事。目前,没有生成错误,但显然不是递增的是,我遇到的问题是,它每次只添加一个新的hashtag,而不是递增计数器