我正在尝试编写一个方法来检查表是否存在。我正在尝试使用using语句使其在我的数据库中保持一致。
public void checkTableExists()
{
connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\keith_000\Documents\ZuriRubberDressDB.mdf;Integrated Security=True;Connect Timeout=30";
string tblnm = "BasicHours";
string str = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = " + tblnm + ");";
SqlDataReader myReader = null;
int count = 0;
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(str, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
MessageBox.Show("The count is " + count);
myReader = command.ExecuteReader();
while (myReader.Read())
{
count++;
}
myReader.Close();
MessageBox.Show("Table Exists!");
MessageBox.Show("The count is " + count);
}
connection.Close();
}
}
}
catch (SqlException ex)
{
MessageBox.Show("Sql issue");
}
catch (Exception ex)
{
MessageBox.Show("Major issue");
}
if (count > 0)
{
MessageBox.Show("Table exists");
}
else
{
MessageBox.Show("Table doesn't exists");
}
}
它在遇到try块时抛出异常。它捕获SqlException
块。
这是我学习再次与数据库交互的地方。解决方案很好,但更重要的是,简要说明我需要学习如何改进代码。
由于
基思
答案 0 :(得分:7)
您的代码失败,因为当您直接编写搜索字符串值的查询时,此值应包含在单引号中,例如' BasicHours'。
但是,对您的实际代码有一些改进 首先,您可以使用简化的sql命令 其次,您使用参数而不是字符串连接。
SqlCommand cmd = new SqlCommand(@"IF EXISTS(
SELECT 1 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @table)
SELECT 1 ELSE SELECT 0", connection);
cmd.Parameters.Add("@table", SqlDbType.NVarChar).Value = tblName;
int exists = (int)cmd.ExecuteScalar();
if(exists == 1)
// Table exists
此命令文本不要求您使用SqlDataReader,因为查询只返回一行,其中包含一行''并且该单个单元格的值为1或0 开销要少得多。
这一部分,最重要的是,你永远不会构建连接字符串的SQL查询。众所周知,这种方法会引起问题。 更糟糕的是SQL Injection,可能会破坏您的数据库或向黑客泄露机密信息。当串联的字符串包含单引号时,次要的是崩溃。始终使用参数化查询。
答案 1 :(得分:1)
我在我的项目中使用了以下代码并为我工作:
try
{
using (con = new SqlConnection(Constr);)
{
con.Open();
string query = $"IF EXISTS (SELECT * FROM sys.tables WHERE name = '{tableName}') SELECT 1 ELSE Select 0;"
Exists = int.Parse(sqlQuery.ExecuteScalar().ToString())==1;
con.Close();
}
}
catch{}
答案 2 :(得分:0)
问题可能在于:string tblnm = "BasicHours";
。您的表名是一个字符串,应该是撇号,请尝试:string tblnm = "'BasicHours'";
在catch catch块中,您还可以记录异常消息和详细信息。
答案 3 :(得分:0)
感谢您对此问题的帮助。这是我实施的解决方案。
public void checkTableExists()
{
connectionString = @"
Data Source=(LocalDB)\MSSQLLocalDB;
AttachDbFilename=C:\Users\keith_000\Documents\ZuriRubberDressDB.mdf;
Integrated Security=True;
Connect Timeout=30";
string tblName = @"BasicHours";
string str = @"IF EXISTS(
SELECT 1 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @table)
SELECT 1 ELSE SELECT 0";
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(str, connection))
{
connection.Open();
SqlCommand cmd = new SqlCommand(str, connection);
cmd.Parameters.Add("@table", SqlDbType.NVarChar).Value = tblName;
int exists = (int)cmd.ExecuteScalar();
if (exists == 1)
{
MessageBox.Show("Table exists");
}
else
{
MessageBox.Show("Table doesn't exists");
}
connection.Close();
}
}
}
catch (SqlException ex)
{
MessageBox.Show("Sql issue");
}
catch (Exception ex)
{
MessageBox.Show("Major issue");
}
}