C# 插入列表<&燃气轮机;进入SQL Server表
我有一个实体C# 插入列表<&燃气轮机;进入SQL Server表,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我有一个实体报告,我想将其值插入数据库表中。必须插入报告的以下属性: reportID - int RoleID - int Created_BY = SYSTEM(default) CURRENT_TIMESTAMP 现在问题在于第二个属性。我有一份带有列表属性的报告角色是一个定义良好的实体,具有ID和名称。从这个列表中,我必须提取每个角色,并将每个角色的ID插入表中 因此,我目前的查询如下: INSERT INTO REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_
报告
,我想将其值插入数据库表中。必须插入报告
的以下属性:
reportID - int
RoleID - int
Created_BY = SYSTEM(default)
CURRENT_TIMESTAMP
现在问题在于第二个属性。我有一份带有列表
属性的报告<代码>角色是一个定义良好的实体,具有ID
和名称
。从这个列表中,我必须提取每个角色,并将每个角色的ID插入表中
因此,我目前的查询如下:
INSERT INTO REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED)
VALUES({0}, {1}, 'SYSTEM', CURRENT_TIMESTAMP)
我分析这些值的C代码如下所示:
try
{
StringBuilder _objSQL = new StringBuilder();
_objSQL.AppendFormat(Queries.Report.ReportQueries.ADD_NEW_ROLES, report.ID, "report.MarjorieRoles.Add(MarjorieRole"));
_objDBWriteConnection.ExecuteQuery(_objSQL.ToString());
_objDBWriteConnection.Commit();
_IsRolesAdded = true;
}
因此,请指导我如何从C#function添加角色假设
lstroles
是您的列表
个人提示:小心SQL注入。我假设你说的是SQL(结构化查询语言),而你实际上指的是MicrosoftSQL Server(实际的数据库产品),对吗
您不能将整个列表作为一个整体插入SQL Server—您需要为每个条目插入一行。这意味着您需要多次调用INSERT语句
这样做:
// define the INSERT statement using **PARAMETERS**
string insertStmt = "INSERT INTO dbo.REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED) " +
"VALUES(@ReportID, @RoleID, 'SYSTEM', CURRENT_TIMESTAMP)";
// set up connection and command objects in ADO.NET
using(SqlConnection conn = new SqlConnection(-your-connection-string-here))
using(SqlCommand cmd = new SqlCommand(insertStmt, conn)
{
// define parameters - ReportID is the same for each execution, so set value here
cmd.Parameters.Add("@ReportID", SqlDbType.Int).Value = YourReportID;
cmd.Parameters.Add("@RoleID", SqlDbType.Int);
conn.Open();
// iterate over all RoleID's and execute the INSERT statement for each of them
foreach(int roleID in ListOfRoleIDs)
{
cmd.Parameters["@RoleID"].Value = roleID;
cmd.ExecuteNonQuery();
}
conn.Close();
}
你考虑过ORM吗?使用LINQtoSQL或实体框架,您可以在半小时内启动并运行它。还有nHibernate。您不应该将SQL语句连接在一起!这为SQL注入攻击打开了大门,而且从性能角度来看,它的速度也比较慢(没有重复使用SQL Server执行计划!)是的,是的,你说得对……是MS SQL Server,谢谢你的帮助并纠正了我的错误。将列表作为xml传递怎么样?那会解决你的问题problem@John:是的-您可以将其作为XML发送-但是您必须在SQL Server中再次“分解”它,这也需要一些工作和代码…您可以使用事务,以便在出现问题时回滚
// define the INSERT statement using **PARAMETERS**
string insertStmt = "INSERT INTO dbo.REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED) " +
"VALUES(@ReportID, @RoleID, 'SYSTEM', CURRENT_TIMESTAMP)";
// set up connection and command objects in ADO.NET
using(SqlConnection conn = new SqlConnection(-your-connection-string-here))
using(SqlCommand cmd = new SqlCommand(insertStmt, conn)
{
// define parameters - ReportID is the same for each execution, so set value here
cmd.Parameters.Add("@ReportID", SqlDbType.Int).Value = YourReportID;
cmd.Parameters.Add("@RoleID", SqlDbType.Int);
conn.Open();
// iterate over all RoleID's and execute the INSERT statement for each of them
foreach(int roleID in ListOfRoleIDs)
{
cmd.Parameters["@RoleID"].Value = roleID;
cmd.ExecuteNonQuery();
}
conn.Close();
}