5


0

Visual Studio Entity Frameworkデザイナーを使用できるようにする最新のMysqlコネクターを持っています。 うまく機能していますが、ストアドプロシージャを追加しました。

サーバーエクスプローラは指定されたパラメータでそれをうまくロードしました、それから私はそれをエンティティモデルに追加しました

これがストアドプロシージャです

CREATE PROCEDURE `GetViewableMenuNodes`(IN siteId INT、IN parentId INT、IN userName varchar(255))開始メニュー・ノードmからm。*を選択します。ここで、m.siteid = siteIdおよびm.showinmenu = 1およびm.parentid = parentIdおよびm viewername = userName;終わり

これはモデルによって生成されたコードです。

public global :: System.Data.Objects.ObjectResult GetViewableMenuNodes(){return base.ExecuteFunction( "GetViewableMenuNodes"); }

7 Answer


6


これが役に立つと思う場合は、MySQL Connector / .NET Entity FrameworkプロバイダーのMySQLのパラメーターを使用してストアード・プロシージャーを処理するために私が使用するアプローチがあります。 ExecuteStoreQuery()を呼び出します。 これにより、モデル内のパラメーターを使用してプロシージャーをマッピングするという課題に対処する必要がなくなりました。 これは私たちのニーズに合っています。

public IList SearchMembers(intメンバーID、文字列countryCode、文字列regionCode、文字列cityCode、浮動小数点距離Km、int性別ID、int ageMin、int ageMax、int offsetRowIndex、int maxRows){

MySqlParameter [] queryParams = new MySqlParameter [] {new MySqlParameter( "memberIDParam"、memberID)、新しいMySqlParameter( "countryCodeParam"、countryCode)、新しいMySqlParameter( "regionCodeParam"、regionCode)、新しいMySqlParameter( "、cityCode)新しいMySqlParameter( "distanceKmParam"、distanceKm)、新しいMySqlParameter( "genderIDParam"、genderID)、新しいMySqlParameter( "ageMinParam"、ageMin)、新しいMySqlParameter( "ageMaxParam"、ageMax)、新しいMySqlParameter( "offset、indexRow、indexIndexRow)" new MySqlParameter( "maxRowsParam"、maxRows)};

StringBuilder sb = new StringBuilder(); sb.Append( "CALL search_members(@memberIDParam、@countryCodeParam、@regionCodeParam、@cityCodeParam、@distanceKmParam、@genderIDParam、@ageMinParam、@ageMaxParam、@ageMaxParam、@offRowsParam、@maxRowsParam)");

string commandText = sb.ToString(); var results = _context.ExecuteStoreQuery(commandText、queryParams);

results.ToList()を返します。 }


4


これが、DbContextでStoredProceduresを実行するために行った小さな拡張です。

パブリック静的リストExecuteStoredProcedure(このDbContext dbContext、文字列storedProcedureName、params object []パラメータ){文字列storedProcedureCommand = "CALL" storedProcedureName "(";

リストaugmentedParameters = parameters.ToList();

storedProcedureCommand = AddParametersToCommand(storedProcedureCommand、augmentedParameters);

storedProcedureCommand = ");";

戻りdbContext.Database.SqlQuery(storedProcedureCommand).ToList(); }

パブリックスタティックリストExecuteStoredRecursiveProcedure(このDbContext dbContext、string storedProcedureName、params object []パラメータ){string

リストaugmentedParameters = parameters.ToList();

storedProcedureCommand = AddParametersToCommand(storedProcedureCommand、augmentedParameters);

storedProcedureCommand = ");";

戻りdbContext.Database.SqlQuery(storedProcedureCommand).ToList(); }

プライベートスタティック文字列AddParametersToCommand(文字列storedProcedureCommand、List augmentedParameters){(int i = 0; i <augmentedParameters.Count(); i){ storedProcedureCommandを返します。 }

プライベート静的文字列AddParameterToCommand(文字列storedProcedureCommand、List augmentedParameters、int i){if(augmentedParameters [i] .GetType()== typeof(文字列)){storedProcedureCommand = "'"; }

storedProcedureCommand =(augmentedParameters [i] .ToString());

if(augmentedParameters [i] .GetType()== typeof(string)){storedProcedureCommand = "'"; }

if(i <augmentedParameters.Count  -  1){storedProcedureCommand = "、"; }

storedProcedureCommandを返します。 }


3


このバグエントリをチェックしてください。

あなたの運についてすみません。 クラブへようこそ。 MySQL Connector / .NET Entity FrameworkからMySQLのストアドプロシージャを適切にサポートしているようには見えません。 スレッドの日付からわかるように、この機能を紹介するために非常に遅い反応がありました。


2


私はそれが同様にSQLインジェクション問題を扱うことができるので私はこのパラメータアプローチがより安全であるのが好きです。 私はそれを次のように一般化しました。

public DbRawSqlQuery ExecuteStoredProcedure(string storedProcedureName、params object [] parameters){string storedProcedureCommand = "CALL" storedProcedureName "(";

リストaugmentedParameters = parameters.ToList();

MySqlParameter [] queryParams; storedProcedureCommand = AddParametersToCommand(storedProcedureCommand、augmentedParameters、out queryParams);

storedProcedureCommand = ");";


return((DbContext)this).Database.SqlQuery(storedProcedureCommand、queryParams); }


プライベート文字列AddParametersToCommand(文字列storedProcedureCommand、List augmentedParameters、out MySqlParameter [] queryParams){string paramName = ""; queryParams = new MySqlParameter [augmentedParameters.Count()]; for(int i = 0; i <augmentedParameters.Count(); i){paramName = "p" i; queryParams [i] = new MySqlParameter(paramName、augmentedParameters [i]); storedProcedureCommand = "@" paramName;

if(i <augmentedParameters.Count  -  1){storedProcedureCommand = "、"; storedProcedureCommandを返します。 }


2


また、mysqlデータベースを扱う際の最も重要なことの1つに注意してください。ストアドプロシージャのパラメータは、常にテーブルの列名とは異なる名前を付けます。それ以外の場合はsp内のクエリに混在します。

例えば:

CREATE authenticate `authenticate_user`(IN p_login_name varchar(50)、IN p_password varchar(80))BEGIN

`login_name` = p_login_nameそして` password` = p_passwordのようなユーザーから `user`.`user_id`、` user`.`login_name`、 `user`.`passwordを選択します。

終わり


2


これは私のコードのサンプルです。これはVS2012とMysqlコネクタ6.8.3で動作するようになったものです。通常どおりにデータモデルを生成し、ストアドプロシージャを含めることを忘れないでください。

この助けが誰かに願っています。

public static IList GetCustOrderHist(string someParameter){IList data =((IObjectContextAdapter)TestDashboardEntities).ObjectContext.ExecuteStoreQuery( "CALL CustOrderHist({0});"、someParameter).ToList();

データを返します。 }

パブリッククラスMyClass {パブリック文字列ProductName {get;}セット; } public int TOTAL {get;}セット; }}


1


ストアドプロシージャを呼び出すことが私の解決策でした。 私は役に立つと思います。

MovieDbEntities db = new MovieDbEntities(); int id = 2。 var result = db.Movie.SqlQuery($ "CALL SP_ReadMovie({id})")。ToList();