Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# ExecuteStoreCommand,多个insert语句生成无效字符错误_C#_Entity Framework_Oracle11g - Fatal编程技术网

C# ExecuteStoreCommand,多个insert语句生成无效字符错误

C# ExecuteStoreCommand,多个insert语句生成无效字符错误,c#,entity-framework,oracle11g,C#,Entity Framework,Oracle11g,有没有一种方法可以在EF中使用ExecuteStoreCommand执行多个insert语句?我正在使用StringBuilder生成多个insert语句。代码基本上是这样的 StringBuilder _saveReasonQuery = new StringBuilder(); public void ApplyRules() { using(var context = new SpecializedDBEntities()) { foreach(var it

有没有一种方法可以在EF中使用ExecuteStoreCommand执行多个insert语句?我正在使用StringBuilder生成多个insert语句。代码基本上是这样的

StringBuilder _saveReasonQuery = new StringBuilder();
public void ApplyRules()
{
    using(var context = new SpecializedDBEntities())
    {
        foreach(var item in list)
        {
            //Do something
            SaveReason(item, reasonId);
        }
        context.GetObjectContext().ExecuteStoreCommand(_saveReasonQuery.ToString());
        ctx.SaveChanges();
    }
}

//Inside Save Reason
public void SaveReason(...)
{
     _saveReasonQuery.Append("INSERT INTO ORDER_IMPLEM_DTL_REASON ");
     _saveReasonQuery.Append("(ORDER_IMPLEM_REASON_ID, SALES_ORDER_IMPLEM_DTL_ID, REASON_ID, REASON_STAT_ID, SALES_ORDER_BRDCST_ID, CREA_BY, CREA_DT)");
     _saveReasonQuery.Append(" VALUES ");
     _saveReasonQuery.Append(String.Format("('0', '{0}', '{1}', '{2}', '{3}', '{4}', TO_DATE('{5}', 'YY-MM-DD HH:mi'));",
                                orderSpot.SALES_ORDER_IMPLEM_DTL_ID, reasonId, Common.Convert_Int64(orderSpot.CUESHT_STAT_ID),
                                orderSpot.SALES_ORDER_DTL_BRDCST_ID, userContext.User.USER_CD, DateTime.Now.ToUniversalTime().ToString("yy-MM-dd hh:mm")));

}
但是,当EF执行查询时,会发生无效字符错误。我做了一些研究,发现是分号产生了这个错误。但我不能删除分号,因为它是Oracle的“行尾”。有什么建议吗

另外,我直接对数据库执行了从StringBuilder生成的字符串,该字符串可用于插入5行。

这两个和其名称中所暗示的更新的字符串将只执行一个命令。我建议您在update语句的
列表中建立您的命令,并在它们准备就绪时按顺序执行它们

public void ApplyRules()
{
    var saveQueries = new List<Tuple<string, object[]>>();
    foreach(var item in list)
    {
        //Do something
        saveQueries.Add(SaveQuery(reasonId, ...));
    }

    using(var context = new SpecializedDBEntities())
    {
        foreach(var saveQuery in saveQueries)
        {
            testContext.Database.ExecuteSqlCommand(saveQuery.Item1, saveQuery.Item2);
        }
        ctx.SaveChanges();
    }
}

private Tuple<string, object[]> SaveQuery(int reasonId, ...)
{
    const string query = 
         "INSERT INTO ORDER_IMPLEM_DTL_REASON " +
         "(ORDER_IMPLEM_REASON_ID, SALES_ORDER_IMPLEM_DTL_ID, REASON_ID, REASON_STAT_ID, SALES_ORDER_BRDCST_ID, CREA_BY, CREA_DT)" +
         " VALUES {0}, {0}, {1}, {2}, {3}, {4}, {5}";

    object[] values = new object[]{
        orderSpot.SALES_ORDER_IMPLEM_DTL_ID,
        reasonId,
        Common.Convert_Int64(orderSpot.CUESHT_STAT_ID),
        orderSpot.SALES_ORDER_DTL_BRDCST_ID, 
        userContext.User.USER_CD, 
        DateTime.Now.ToUniversalTime().ToString("yy-MM-dd hh:mm")
    };

    return new Tuple<string, object[]>(query, values);
}
public void ApplyRules()
{
var savequerys=new List();
foreach(列表中的变量项)
{
//做点什么
添加(SaveQuery(reasonId,…);
}
使用(var context=newspecializedbentities())
{
foreach(savequerys中的var saveQuery)
{
testContext.Database.ExecuteSqlCommand(saveQuery.Item1,saveQuery.Item2);
}
ctx.SaveChanges();
}
}
私有元组保存查询(int-reasonId,…)
{
常量字符串查询=
“将原因插入订单”+
(订单执行原因识别号、销售订单执行数据识别号、原因识别号、原因统计识别号、销售订单执行数据识别号、客户识别号、客户识别号)+
“值{0}、{0}、{1}、{2}、{3}、{4}、{5}”;
对象[]值=新对象[]{
orderSpot.SALES\u ORDER\u IMPLEM\u DTL\u ID,
理性的,
Common.Convert_Int64(orderSpot.CUESHT_STAT_ID),
orderSpot.SALES\u ORDER\u DTL\u BRDCST\u ID,
userContext.User.User\u CD,
DateTime.Now.ToUniversalTime().ToString(“yy-MM-dd-hh:MM”)
};
返回新元组(查询、值);
}

我通过反复试验找到了解决方案

事实证明,您需要将多个插入项括在一个开始…结束内;语句,以使分号能够作为行尾分隔符读取

我现在的代码如下所示:

StringBuilder _saveReasonQuery = new StringBuilder();
public void ApplyRules()
{
    using(var context = new SpecializedDBEntities())
    {
        _saveReasonQuery.Append("BEGIN ");
        foreach(var item in list)
        {
            //Do something
            SaveReason(item, reasonId);
        }
        _saveReasonQuery.Append("END;");
        context.GetObjectContext().ExecuteStoreCommand(_saveReasonQuery.ToString());
        ctx.SaveChanges();
    }
}

//Inside Save Reason
public void SaveReason(...)
{
     _saveReasonQuery.Append("INSERT INTO ORDER_IMPLEM_DTL_REASON ");
     _saveReasonQuery.Append("(ORDER_IMPLEM_REASON_ID, SALES_ORDER_IMPLEM_DTL_ID, REASON_ID, REASON_STAT_ID, SALES_ORDER_BRDCST_ID, CREA_BY, CREA_DT)");
     _saveReasonQuery.Append(" VALUES ");
     _saveReasonQuery.Append(String.Format("('0', '{0}', '{1}', '{2}', '{3}', '{4}', TO_DATE('{5}', 'YY-MM-DD HH:mi'));",
                            orderSpot.SALES_ORDER_IMPLEM_DTL_ID, reasonId, Common.Convert_Int64(orderSpot.CUESHT_STAT_ID),
                            orderSpot.SALES_ORDER_DTL_BRDCST_ID, userContext.User.USER_CD, DateTime.Now.ToUniversalTime().ToString("yy-MM-dd hh:mm")));

}

展示你的代码示例也许你做了一些不正确的事情,但是我们不能告诉你,除非我们看到一些现有的代码示例。ThanksI有点希望有另一种方法可以同时执行它们。谢谢你的回答。:)