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政策