Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# 插入列表<&燃气轮机;进入SQL Server表_C#_Asp.net_Sql Server - Fatal编程技术网

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();
}