【问题标题】:TSQL - An object or column name is missing or empty .. When trying to backup sql server database to diskTSQL - 对象或列名丢失或为空.. 尝试将 sql server 数据库备份到磁盘时
【发布时间】:2021-12-12 02:32:51
【问题描述】:

发生错误的我的连接字符串

<add name="SmartSales_local" connectionString="Server=.\SQLEXPRESS;Integrated Security=true;AttachDbFileName=|DataDirectory|\SmartSales.mdf;"
          providerName="System.Data.SqlClient" />
My Database Backup Code in C#
            con.ConnectionString = MyConnection();
            String receiptdir = @"D:\SmatSalesReports\Backup";
            if (!Directory.Exists(receiptdir))
            {
                Directory.CreateDirectory(receiptdir);
            }
            string dbname = con.Database.ToString();
            
            string backupdb = "BACKUP DATABASE [" + dbname + "] TO DISK='" + receiptdir + "\\" + "SmartSales" + "-" + DateTime.Now.ToString("yyyy-MM-dd--HH-mm-ss") + ".bak'";
            
            
            con.Open();
            cm = new SqlCommand(backupdb, con);
            cm.CommandTimeout = 120;
            cm.ExecuteNonQuery();
            con.Close();

我在尝试将 sql server 数据库备份到磁盘时收到此错误。其他一切都可以在数据库中“插入/更新/删除”正常工作。 当我尝试备份数据库时,它给了我这个错误。 Screenshot of the error described

对象或列名丢失或为空。对于 SELECT INTO 语句,验证每一列都有一个名称。对于其他语句,请查找空别名。不允许使用定义为 "" 或 [] 的别名。将别名更改为有效名称。

编辑后添加的新信息

我的连接字符串一切正常

<add name="SmartSales" connectionString="Data Source=LAPTOP-GPJ5DM2V\SQLEXPRESS;Initial Catalog=SmartSales;Integrated Security=True"
      providerName="System.Data.SqlClient" />

当我使用此连接字符串时,一切正常。但它在安装 SSMS 并在 SSMS 中打开数据库时有效。

【问题讨论】:

  • con.Open()所在的行放一个断点,查看backupdb此时的值。它是有效的 SQL 并且在 SSMS 中运行吗?该错误听起来与您发布的代码无关。你确定你的代码中没有混入一些事件处理程序吗?
  • @squillman 是的,它在 SSMS 中成功运行。

标签: c# sql-server visual-studio entity-framework linq-to-sql


【解决方案1】:

除了@squillman 在评论中的建议之外,您将得到backup database [] to disk='yourpath.bak'; 的确切错误。在打开连接之前不会自动设置连接数据库属性,因此您需要在打开之后移动这些行:

con.Open();
string dbname = con.Database.ToString();
string backupdb = "BACKUP DATABASE [" + dbname + "] TO DISK='" + receiptdir + "\\" + "SmartSales" + "-" + DateTime.Now.ToString("yyyy-MM-dd--HH-mm-ss") + ".bak'";

【讨论】:

    【解决方案2】:

    您在这里遇到了许多问题:

    • 您的主要问题:您依赖con.Database 的(实际上是空的)值将数据库设置为备份。如果确实需要从连接字符串中解析出来,可以使用SqlConnectionStringBuilder,也可以先打开连接
    • 您正在使用AttachDbFilename, which has been deprecated and is generally a bad idea
    • BACKUP 命令完全可以参数化,你应该这样做
    • 您需要使用using 处理您的连接和命令对象
    String receiptdir = @"D:\SmatSalesReports\Backup";
    if (!Directory.Exists(receiptdir))
    {
        Directory.CreateDirectory(receiptdir);
    }
                
    const string backupdb = @"
    BACKUP DATABASE @dbname TO DISK = @location;
    ";
    var location = Path.Combine(receiptdir, @"\SmartSales-" + DateTime.Now.ToString("yyyy-MM-dd--HH-mm-ss") + ".bak");
    
    using(var con = new SqlConnection(MyConnection())
    using(var cm = new SqlCommand(backupdb, con) { CommandTimeout = 120})
    {
        con.Open();
        cm.Parameters.Add("@dbname", SqlDbType.NVarChar, 128) = con.Database.ToString();
        cm.Parameters.Add("@location", SqlDbType.NVarChar, 255) = location;
        cm.ExecuteNonQuery();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多