C# 从表中获取PrimaryKey
我试图使用该表的主键从数据库中获取数据。问题是每个表的主键名称将不同 例如,用户可能想要调出employee表,主键是Emp_ID。然后他们想要调出manufacturers表,主键是Manu_ID 由于信息是在同一个ViewModel中提取的,所以一切都需要是动态的 下面是我查看制造商表的SQL语句: C#:C# 从表中获取PrimaryKey,c#,sql,sql-server-2008,select,primary-key,C#,Sql,Sql Server 2008,Select,Primary Key,我试图使用该表的主键从数据库中获取数据。问题是每个表的主键名称将不同 例如,用户可能想要调出employee表,主键是Emp_ID。然后他们想要调出manufacturers表,主键是Manu_ID 由于信息是在同一个ViewModel中提取的,所以一切都需要是动态的 下面是我查看制造商表的SQL语句: C#: 其中一些已经在动态实现,比如来自用户的主键和表名。我想如果我总是能在我的表中找到主键,那么它应该可以工作。有没有办法做到这一点?我正在使用SQLServer2008R2。非常感谢您的帮助
其中一些已经在动态实现,比如来自用户的主键和表名。我想如果我总是能在我的表中找到主键,那么它应该可以工作。有没有办法做到这一点?我正在使用SQLServer2008R2。非常感谢您的帮助。此查询将获得pkey列名:
SELECT
cu.CONSTRAINT_NAME,
cu.COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
WHERE
EXISTS
(
SELECT tc.*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
WHERE
tc.CONSTRAINT_CATALOG = 'dbName'
AND tc.TABLE_NAME = 'tableName'
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND tc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME
)
那么,您想创建一个通用查询,该查询将接受表名和列名作为参数 试试这个: 首先,创建一个存储过程,该存储过程将基于参数创建通用查询
-- @tabName = table name
-- @colName = column name
-- @colVal = column value
create proc p1 @tabName varchar(100), @colName varchar(100), @colVal varchar(100)
as
begin
declare @sql nvarchar(max) = N'select * from ' + @tabName + ' where ' + @colName + ' = ''' + @colVal + ''''
exec sp_executesql @sql
end
然后,从代码中调用该存储过程:
string strSQLconnection = (connectionString);
SqlConnection sqlConnection = new SqlConnection(strSQLconnection);
sqlConnection.Open();
SqlCommand sqlCommand = new SqlCommand("p1", sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@tabName", "table1");
sqlCommand.Parameters.AddWithValue("@colName", "col1");
sqlCommand.Parameters.AddWithValue("@colVal", "1");
SqlDataReader reader = sqlCommand.ExecuteReader();
sqlConnection.Close();
您需要使用哪些DBMS?是否需要考虑主键是多个列的表?在许多数据库系统中,主键不需要是单个列。数据库对象(表、存储过程或任何其他对象)不能作为参数传递。只有列或变量的实际值才能作为参数。您需要动态地构建SQL语句。为了检索表的PK,您可以将自己设置在下面的“EricLippert”上,而不必考虑这一点。它们都是一样的。
string strSQLconnection = (connectionString);
SqlConnection sqlConnection = new SqlConnection(strSQLconnection);
sqlConnection.Open();
SqlCommand sqlCommand = new SqlCommand("p1", sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@tabName", "table1");
sqlCommand.Parameters.AddWithValue("@colName", "col1");
sqlCommand.Parameters.AddWithValue("@colVal", "1");
SqlDataReader reader = sqlCommand.ExecuteReader();
sqlConnection.Close();