Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从表中获取PrimaryKey_C#_Sql_Sql Server 2008_Select_Primary Key - Fatal编程技术网

C# 从表中获取PrimaryKey

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。非常感谢您的帮助

我试图使用该表的主键从数据库中获取数据。问题是每个表的主键名称将不同

例如,用户可能想要调出employee表,主键是Emp_ID。然后他们想要调出manufacturers表,主键是Manu_ID

由于信息是在同一个ViewModel中提取的,所以一切都需要是动态的

下面是我查看制造商表的SQL语句:

C#:


其中一些已经在动态实现,比如来自用户的主键和表名。我想如果我总是能在我的表中找到主键,那么它应该可以工作。有没有办法做到这一点?我正在使用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();