【问题标题】:Updating query with comparison between string and varchar(max)使用字符串和 varchar(max) 之间的比较更新查询
【发布时间】:2013-06-06 14:44:45
【问题描述】:

我有一个这样的更新查询:

 public void Update_Download(string _url){
            Data.Connect();
            using (Data.connexion)
            {

                string queryString = "update Fichier set Last_download=@last , Downloads_count= Downloads_count + 1  where Url = @url ";


                SqlCommand command = new SqlCommand(queryString, Data.connexion);
                command.Parameters.AddWithValue("@last", DateTime.Now);
                command.Parameters.AddWithValue("@url", _url);
                try
                {
                  SqlDataReader reader = command.ExecuteReader();
                 }
                catch { }

                }
         }


    }
}

字符串连接:

public static SqlConnection connexion;


        public static bool  Connect()
        {
                System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
                builder["Initial Catalog"] = "Upload";
                builder["Data Source"] = "bd";
                builder["integrated Security"] = true;
                string connexionString = builder.ConnectionString;
                connexion = new SqlConnection(connexionString);
                try { connexion.Open(); return true; }
                catch { return false; }

        }
        public static  void Disconnect()
        {
            if (connexion != null) connexion.Close();
            connexion = null;
        }

查询正在执行,但表中没有任何变化。属性Url 的类型是varchar(Max),DBMS 是Sql Server

那么问题是什么?如何更正我的查询?

【问题讨论】:

    标签: c# .net sql sql-server ado.net


    【解决方案1】:

    问题在于您使用的是ExecuteReader 命令。将其更改为:

    command.ExecuteNonQuery();
    

    现在,除此之外,我想提供一些建议。考虑对当前代码进行以下修改:

    public void Update_Download(string _url)
    {
        try
        {
            using (SqlConnection connexion = Data.Connect())
            {
                string queryString = "update Fichier set Last_download=@last , Downloads_count= Downloads_count + 1  where Url = @url ";
    
                using (SqlCommand command = new SqlCommand(queryString, connexion))
                {
                    command.Parameters.AddWithValue("@last", DateTime.Now);
                    command.Parameters.AddWithValue("@url", _url);
                    command.ExecuteNonQuery();
                }
            }
        }
        catch (Exception ex)
        {
        }
    }
    

    并考虑让Data.Connect() 返回new SqlConnection(...),因为您想遵循该程序。当您需要一个新连接时,使用new 操作获得一个,并让 SQL Server 管理池。 从不共享连接。

    我不确定你是否在共享连接,这只是一个观察结果。

    【讨论】:

    • @Lamloumi,所以如果是这样的话,WHERE 子句就是你的问题。我无法告诉你为什么 url 字段与 @url 中的值不匹配,这是你必须调试的。
    • @Lamloumi,我想说的是,如果您使用 ExecuteNonQuery 代替 ExecuteReader在您的原始代码中,它不是更新数据库,然后WHERE 子句将防止任何记录受到影响。我在这里无能为力,因为您需要确定为什么数据库中不存在 _url 的值。
    • 我把ExecuteReader改成了ExecuteNonQuery_url 的值是一个文件的 url,它是正确的,因为我成功下载它并且调试中的 _url 的值是 true
    • @Lamloumi,但是Fichier 中是否有带有该 URL 的记录?
    【解决方案2】:

    是的,正如您在 MSDN 中的此链接中看到的那样:

    http://msdn.microsoft.com/en-ca/library/system.data.sqlclient.sqlcommand(v=vs.80).aspx

    ExecuteNonQuery :执行 Transact-SQL INSERT、DELETE、UPDATE 和 SET 语句等命令。

    所以尝试使用这个方法,这应该可以工作!

    【讨论】:

    • 你使用过 Michael Perrenoud 给出的代码吗?用“使用”创建 SQLCONnection ?
    • 好的,我看到你没有做任何事情。也许你得到了一个例外,你看不到它。要确认这一点,在 Vs Studio 中,按 CTRL+ALT+e,然后选中 Common Language Runtime Exceptions 旁边的“Thrown”,然后确定。它应该向您显示应用程序中发生的所有异常(只要您在调试模式下运行)
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多