我正在尝试创建一个通用函数来进行数据库调用(参见下面的代码)。我已将该功能放在一个单独的解决方案中,以便我可以在不同的项目中使用它。
行:
Permission denied
给我错误:
无效的对象名称' VM_MailData'
(VM_MailData是我添加为通用类型T的类型)
var data = d.Database.SqlQuery<T> (sql).First();
答案 0 :(得分:1)
您可能需要使用某种基本类型ProcessData<T>(string Group, int Id)
来呼叫VM_MailData
。我假设VM代表“视图模型”,你有类似
public class MailData
{
}
public class VM_MailData : MailData
{
}
其中MailData类实际上是具有相应表的类。
因此,您无需致电ProcessData<VM_MailData >("some group", 1)
,而是需要致电ProcessData<MailData>("some group", 1)
。
<强> P.S。你真的应该使用参数化查询来避免SQL注入!
答案 1 :(得分:0)
我可以看到你要去哪里:)所以...... 您必须创建一个从Type映射到适当的表名称的映射(字典)。您可以根据类型名称或表格使用某种约定来构建它。
使用这些来获取dabatase中可用的表和视图
SELECT SCHEMA_NAME(schema_id) as SchemaName, name as Name FROM sys.tables
SELECT SCHEMA_NAME(schema_id) as SchemaName, name as Name FROM sys.views
您可以使用以下脚本获取表的主键列。
DECLARE @origin_table_name AS VARCHAR(50)
SET @origin_table_name = 'Your_table_name_goes_here'
SELECT
s.name AS TABLE_SCHEMA
, t.name AS TABLE_NAME
, c.name AS COLUMN_NAME
, k.name AS CONSTRAINT_NAME
, ic.key_ordinal AS ORDINAL_POSITION
FROM
sys.key_constraints AS k
JOIN sys.tables AS t ON t.object_id = k.parent_object_id
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
JOIN sys.index_columns AS ic ON ic.object_id = t.object_id
AND ic.index_id = k.unique_index_id
JOIN sys.columns AS c ON c.object_id = t.object_id
AND c.column_id = ic.column_id
WHERE
k.type = 'PK'
AND t.name = @origin_table_name
祝你好运