Entity Framework Probleme mit StoredProcedure Functions
-
Hallo,
habe probleme mit Entity Framwork meine StoredProcedure functions zu importieren von der datenbank.
hab es probiert rein ohzne SQL statements, jedoch wenn ich bei der .edmx datei auf Add function gehn will kommt ein error:
"Function imports cannot be created for composable functions"
und finde rein keine lösung um das zu ändern bzw zu beheben.
dann hab ich es mal mit SQL Statment probiert und das ganze auf ein objekt zu packen wie es in manchen Tutorial gezeigt wird.
String sCommand = "select count(*)" +
"from masterdata.customers" +
"where customernumber = DataMigration.ExtendCustomerNumber("+customerNumber+")";//customer ist einfach ne variable die einen wert übergibt
var query = new ObjectQuery<CardPrints>(sCommand, _lyoContext);
foreach (var qStr in query)
{
Console.WriteLine(qStr.CustomerNumber + " <<< ");
}hier jedoch kommt ein error mit:
"Die Abfragesyntax ist ungültig. Nahe Begriff '*', Linie 1, Spalte 15."
EntitySQLException
ganz ohne Entity Framework hab ich das alles schon geschafft, von der hab ich auch das SQL statment kopiert.,..
könnte mir jmd helfen das eine dieser beiden Methoden funktioniert?.
am liebsten wäre mir wenn die ohne SQL statment funktionieren würde
-
Da fehlen die Leerzeichen in Deinem SQL-String:
"select count(*)" +
"from masterdata.customers" +
"where customernumberDas ergibt doch:
select count(*)from masterdata.customerswhere customernumber=Ist doch logisch das dass auf nen Fehler läuft. Es sei denn Du hast es hier nur fürs Forum abgetippert und dabei die Leerzeichen vergessen...
-
hmm weiß´jetzt nd ganz, vllt liegts wirklich an dem^^.
muss ich am montag in der arbeit dann probieren.aber aflls jemand noch lösungs vorschlag hat wegen meinem ersten problem
das ich das auch ohne sql statments machen kann.bitte schreiben
danke im voraus
-
Googlen hilft: http://stackoverflow.com/questions/5866705/function-imports-cannot-be-created-for-composable-functions
Besonders letzter Link dadrin: How to: Call Custom Database Functions
-
beide hab ich schon gelesen
entweder ich machs falsch oder es passt nd....
-
int result;
String sCommand = "select count(*) from masterdata.customers where customernumber = DataMigration.ExtendCustomerNumber(" +customerNumber + ")";
result = int.Parse(_lyoContext.CreateQuery<CardPrints>(sCommand).ToList().ToString());
Console.WriteLine(result);bei result = int.parse(.......
bekomme ich den error
Die Abfragesyntax ist ungültig. Nahe Begriff '*', Linie 1, Spalte 15.
EntitySqlExceptionUnd wenn ich es probiere ohne direkt SQL-statments aufzurufen
private LyoERPEntities _lyoContext;
[EdmFunction("LyoERPModel.Store", "ExtendCustomerNumber")]
public static string MigrateFunction(Int64 customerNumber)
{
throw new NotSupportedException("This function is only for L2E query.");
}public void checkForValidCustomerNumbers(Int64 customerNumber)
{using(_lyoContext = new LyoERPEntities())
{
var result = from d in _lyoContext.Customers
where d.CustomerNumber.Equals(MigrateFunction(customerNumber))
select d;Console.WriteLine(result.ToString() + " : is result");
bekomme ich als ausgabe:
System.Data.Objects.ObjectQuery`1[KartenNummer_Import_Export.Customers] : is resultkann man irgendwie den wert davon bekommen oder steht da einfach nur das drauf?
-
hab das sql statment im sql managerstudio probiert,
da funktioniert es....liegts am count(*) ??
-
Könntest du bitte deine Beiträge noch mal editieren und deinen Code in Code-Tags (Button "C#") packen, danke...
-
habe es bereits selbst gelöscht trotzdem danke:
mein lösungs weg für die, die vllt das selbe problem mal haben:private LyoERPEntities _lyoContext;
private List<Int64> _listChecked = new List<Int64>();
private List<Int64> _invalidNumList = new List<Int64>();
private int _count = 0;
private bool _valid;[EdmFunction("LyoERPModel.Store", "ExtendCustomerNumber")]
public static Int64 MigrateFunction(Int64 customerNumber)
{
throw new NotSupportedException("This function is only for L2E query.");
}public void checkForValidCustomerNumbers(Int64 customerNumber)
{
using(_lyoContext = new LyoERPEntities())
{
try
{
var result = from d in _lyoContext.Customers
where d.CustomerNumber == MigrateFunction(customerNumber)
select d.CustomerNumber;Int64 val = result.Single();
_listChecked.Add(val);
}
catch(Exception ex)
{
_invalidNumList.Add(customerNumber);
_count++;
}
}}
Ich habe immer eine System.Data.Objects.ObjectsQuery value auf result zurückbekommen und mittels result.single() bekomme ich dann den wert der da drauf steht zurück.(Achtung wenn mehr als 1 wert zurück kommt oder kein wert wirft es eine exception raus)
hab auch das versucht mit SQL-Statments
Lösung:using (_lyoContext = new LyoERPEntities())
{
_lyoContext.ExecuteStoreCommand("DELETE FROM Import.CardPrints");
_lyoContext.SaveChanges();
}so kann man sql statments ausführen.
hab auch einmal parameter benutzten müssen, das würde dann so gehen.....:
using (_lyoContext = new LyoERPEntities())
{try
{
_valid = true;
var result = from d in _lyoContext.Users
where d.UserName == createdBy
select d;
string userId = result.Single().UserID.ToString();System.Data.SqlClient.SqlParameter parameter = new SqlParameter
{
ParameterName = "requestName",
Value = requestName,
SqlDbType = SqlDbType.Text};
var parameters = new object[]{parameter};_lyoContext.ExecuteStoreCommand("EXEC Import.p_GenerateCardPrintRequests " + cardNr + ","
+cardTypId + "," + "@requestName" +"," + productNumber + ",'" + userId + "'",parameters);
Console.WriteLine(userId);}
catch (Exception ex)
{
_valid = false;
Console.WriteLine("not valid username" + ex.Message);
}}
parameter musste ich verwenden da mein requestName sonst bei leerzeichen oder sonderzeichen eine Exception bekommt!
danke für eure hilfe vllt kann meine lösung auch jmd helfen
-
hier her kommt das requestName
public void ImportingSQL(int cardTypId, int cardNr, String requestName, String createdBy, String productNumber)
{.....
code den ich oben rein kopiert habe
.....}