EFcore3.1 从 sys.master_files 和 SERVERPROPERTY 获取值
EFcore3.1 get values from sys.master_files and SERVERPROPERTY
我需要我的(控制台)应用程序来获取一些常规的 SQLserver 数据库信息。
在 SQLserver management studio 中,我 运行 在 master 系统数据库上查询:
SELECT @@VERSION, name, physical_name, size, SERVERPROPERTY('Edition'), SERVERPROPERTY('ProductVersion'), SERVERPROPERTY('MachineName')
FROM sys.master_files
WHERE name = 'mydb'
我得到一个 table 单行和 7 列我需要的值
如何从 EFcore 执行此操作?
我知道我需要使用 ExecuteSqlRaw
,因为我没有也不想要 DBContext,但是我不确定
- 如何在主系统 table 上执行它?和
- 如何得到结果? (因为字符串很好)
感谢任何帮助
我最终是这样解决的:
var server = "localhost";
var username = "user";
var password = "password";
var conString = "Server=" + server + ";Database=master;User Id=" + username +";Password=" + password;
string version="", machineName="", physicalName="";
float mydbDataFileSizeGB=-1, maxSizeGB=-1;
try {
using SqlConnection con = new SqlConnection(conString);
con.Open();
var query = @"
SELECT
@@VERSION AS Version,
SERVERPROPERTY('MachineName') AS MachineName,
physical_name AS PhysicalName,
CAST(CASE WHEN type = 0 THEN size * 8. / 1024.0 / 1024.0 ELSE 0 END AS DECIMAL(8,2)) AS MydbDataFileSizeGB,
CAST(CASE WHEN serverproperty('EngineEdition') = 4 THEN CASE WHEN SERVERPROPERTY('productversion') between '10.50' and '5' THEN 10 ELSE 4 END ELSE -1 END AS DECIMAL(8,2)) AS MaxSizeGB
FROM sys.master_files
WHERE name = 'Mydb_Data'
";
using SqlCommand cmd = new SqlCommand(query, con);
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read()) {
version = rdr.GetString(0);
machineName = rdr.GetString(1);
physicalName = rdr.GetString(2);
mydbDataFileSizeGB = decimal.ToSingle(rdr.GetDecimal(3));
maxSizeGB = decimal.ToSingle(rdr.GetDecimal(4));
}
} catch (Exception) {
...
}
要在 EFCore 3.1 中执行此操作,您需要创建一个模型来表示您尝试检索的数据,然后使用 FromSqlRaw 或 FromSqlInterpolated 来填充该模型。
您将需要使用 DbContext 来执行此操作。因此,如果这是您的硬性要求,那么像您所做的那样求助于 ADO.NET 是一种方法。
ExecuteSqlRaw/ExecuteSqlInterpolated 只会 return 一个整数结果。
我需要我的(控制台)应用程序来获取一些常规的 SQLserver 数据库信息。
在 SQLserver management studio 中,我 运行 在 master 系统数据库上查询:
SELECT @@VERSION, name, physical_name, size, SERVERPROPERTY('Edition'), SERVERPROPERTY('ProductVersion'), SERVERPROPERTY('MachineName')
FROM sys.master_files
WHERE name = 'mydb'
我得到一个 table 单行和 7 列我需要的值
如何从 EFcore 执行此操作?
我知道我需要使用 ExecuteSqlRaw
,因为我没有也不想要 DBContext,但是我不确定
- 如何在主系统 table 上执行它?和
- 如何得到结果? (因为字符串很好)
感谢任何帮助
我最终是这样解决的:
var server = "localhost";
var username = "user";
var password = "password";
var conString = "Server=" + server + ";Database=master;User Id=" + username +";Password=" + password;
string version="", machineName="", physicalName="";
float mydbDataFileSizeGB=-1, maxSizeGB=-1;
try {
using SqlConnection con = new SqlConnection(conString);
con.Open();
var query = @"
SELECT
@@VERSION AS Version,
SERVERPROPERTY('MachineName') AS MachineName,
physical_name AS PhysicalName,
CAST(CASE WHEN type = 0 THEN size * 8. / 1024.0 / 1024.0 ELSE 0 END AS DECIMAL(8,2)) AS MydbDataFileSizeGB,
CAST(CASE WHEN serverproperty('EngineEdition') = 4 THEN CASE WHEN SERVERPROPERTY('productversion') between '10.50' and '5' THEN 10 ELSE 4 END ELSE -1 END AS DECIMAL(8,2)) AS MaxSizeGB
FROM sys.master_files
WHERE name = 'Mydb_Data'
";
using SqlCommand cmd = new SqlCommand(query, con);
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read()) {
version = rdr.GetString(0);
machineName = rdr.GetString(1);
physicalName = rdr.GetString(2);
mydbDataFileSizeGB = decimal.ToSingle(rdr.GetDecimal(3));
maxSizeGB = decimal.ToSingle(rdr.GetDecimal(4));
}
} catch (Exception) {
...
}
要在 EFCore 3.1 中执行此操作,您需要创建一个模型来表示您尝试检索的数据,然后使用 FromSqlRaw 或 FromSqlInterpolated 来填充该模型。
您将需要使用 DbContext 来执行此操作。因此,如果这是您的硬性要求,那么像您所做的那样求助于 ADO.NET 是一种方法。
ExecuteSqlRaw/ExecuteSqlInterpolated 只会 return 一个整数结果。