TSQL - 对象或列名丢失或为空.. 尝试将 sql server 数据库备份到磁盘时

Posted

技术标签:

【中文标题】TSQL - 对象或列名丢失或为空.. 尝试将 sql server 数据库备份到磁盘时【英文标题】:TSQL - An object or column name is missing or empty .. When trying to backup sql server database to disk 【发布时间】: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 中成功运行。 【参考方案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();

【讨论】:

以上是关于TSQL - 对象或列名丢失或为空.. 尝试将 sql server 数据库备份到磁盘时的主要内容,如果未能解决你的问题,请参考以下文章

Azure API管理:原始标头丢失或为空,并且该请求被分类为非跨域。未应用CORS政策

如果为空白或为空,如何将文本框的值设置为“0”?

thymeleaf 中的身份验证对象为 null 或为空

ALAssetsLibrary 无效或为空

不能收缩 ID 为 %s 的数据库中 ID 为 %s 的文件,因为它正由其他进程收缩或为空。

当数据未定义或为空时如何使用 Lodash