2つのテーブルにデータを挿入する際に問題が発生しています。 次のように私は2つの異なる手順を作成しました:-Hereが最初の手順ですEntity Framework:データリーダーが指定された「NPAModel.NPAAddApplication」と互換性がありません。
CREATE PROCEDURE [dbo].[NPAAddApplicant]
@szName varchar(100),
@szCompPostalAdd varchar(200),
@szCompStreet varchar(200),
@szCompTel1 varchar(100),
@szCompTel2 varchar(50),
@szFax varchar(50),
@szCompEmailAdd varchar(50),
@szCompWebSite varchar(100),
@szContPersonName varchar(200),
@szContactPhone1 varchar(50),
@szContactPhone2 varchar(50),
@szContactPhone3 varchar(50),
@szContEmail varchar(50),
@iUserId bigint,
@iStatus int,
@iConcurrency int,
@iCompanyId bigint,
@szType varchar(50),
@szContactDesignation varchar(150),
@szCertificateOfIncorporation varchar(50),
@iTypeOfBunkering int,
@iZoneId bigint,
@dLicenseDate date,
@szImlBpCode varchar(50),
@iTownId bigint,
@iNewApplicant bigint
AS
BEGIN
declare @szCode varchar(25)
EXEC spGenTransCode @szType, @retval = @szCode OUTPUT
INSERT INTO psApplicant
(szCode,szName,szCompPostalAdd,szCompStreet,szCompTel1,szCompTel2,szFax,szCompEmailAdd,szCompWebSite,szContPersonName,
szContactPhone1,szContactPhone2,szContactPhone3,szContEmail,iUserId,iStatus,iConcurrency,iCompanyId,szType,szContactDesignation,
szCertificateOfIncorporation,dStampDate,dCreatedate,iTypeOfBunkering,iZoneId,dLicenseDate,szImlBpCode,iTownId,iNewApplicant)
VALUES
(@szCode, @szName, @szCompPostalAdd, @szCompStreet, @szCompTel1, @szCompTel2, @szFax, @szCompEmailAdd, @szCompWebSite,
@szContPersonName, @szContactPhone1, @szContactPhone2, @szContactPhone3, @szContEmail, @iUserId, @iStatus, @iConcurrency,
@iCompanyId, @szType, @szContactDesignation, @szCertificateOfIncorporation, GETDATE(), GETDATE(), @iTypeOfBunkering,
@iZoneId, @dLicenseDate, @szImlBpCode, @iTownId,@iNewApplicant)
SELECT SCOPE_IDENTITY() AS NewApplicant;
END
-Hereは、2番目の手順です:
CREATE PROC [dbo].[NPAAddApplication]
@iApplicantId bigint,
@iStageId bigint,
@iApplicationTypeId bigint,
@iUserId bigint,
@szTransId varchar(25)
AS
BEGIN
EXEC spGenTransCode 'APP', @retval = @szTransId OUTPUT
INSERT INTO [dbo].[psApplication]
(
iApplicantId,
dAppdate,
iStageId,
dStampdate,
iApplicationTypeId,
iUserId,
szTransId
)
VALUES
(
@iApplicantId,
GETDATE(),
1,
GETDATE(),
@iApplicationTypeId,
@iUserId,
@szTransId
)
SELECT @szTransId as NewApplicationTransaction
END
今、私は、Web API POSTメソッドを持っていますpsApplicationとpsApplicationの両方のテーブルに同時にデータをロードするのに役立ちますが、psApplicationテーブルのiApplicantIdは自動的にpsApplicantテーブルのpkIdを選択します。正しい。次のように APIの私のC#のコードは次のとおりです。
public long PostApplicants(mApplicant applicanto)
{
mApplicant newApplicant = new mApplicant();
newApplicant.szName = applicanto.szName;
newApplicant.szCode = applicanto.szCode;
newApplicant.szCompPostalAdd = applicanto.szCompPostalAdd;
newApplicant.szCompStreet = applicanto.szCompStreet;
newApplicant.szCompTel1 = applicanto.szCompTel1;
newApplicant.szCompTel2 = applicanto.szCompTel2;
newApplicant.szFax = applicanto.szFax;
newApplicant.szCompEmailAdd = applicanto.szCompEmailAdd;
newApplicant.szCompWebSite = applicanto.szCompWebSite;
newApplicant.szContPersonName = applicanto.szContPersonName;
newApplicant.szContactPhone1 = applicanto.szContactPhone1;
newApplicant.szContactPhone2 = applicanto.szContactPhone2;
newApplicant.szContactPhone3 = applicanto.szContactPhone3;
newApplicant.szContEmail = applicanto.szContEmail;
newApplicant.iUserId = applicanto.iUserId;
newApplicant.iStatus = applicanto.iStatus;
newApplicant.iConcurrency = applicanto.iConcurrency;
newApplicant.iCompanyId = applicanto.iCompanyId;
newApplicant.szType = applicanto.szType;
newApplicant.szContactDesignation = applicanto.szContactDesignation;
newApplicant.szCertificateOfIncorporation = applicanto.szCertificateOfIncorporation;
newApplicant.iTypeOfBunkering = applicanto.iTypeOfBunkering;
newApplicant.iZoneId = applicanto.iZoneId;
newApplicant.dLicenseDate = applicanto.dLicenseDate;
newApplicant.szImlBpCode = applicanto.szImlBpCode;
newApplicant.iTownId = applicanto.iTownId;
newApplicant.iNewApplicant = applicanto.iNewApplicant;
var ObjApplicant = applicanto.MyApplications as List<mApplications>;
try
{
NPAEntities contextApp = new NPAEntities();
var newCrit = contextApp.NPAAddApplicant(newApplicant.szName, newApplicant.szCompPostalAdd, newApplicant.szCompStreet,
newApplicant.szCompTel1, newApplicant.szCompTel2, newApplicant.szFax, newApplicant.szCompEmailAdd, newApplicant.szCompWebSite,
newApplicant.szContPersonName, newApplicant.szContactPhone1, newApplicant.szContactPhone2, newApplicant.szContactPhone3,
newApplicant.szContEmail, newApplicant.iUserId, newApplicant.iStatus, newApplicant.iConcurrency, newApplicant.iCompanyId,
newApplicant.szType, newApplicant.szContactDesignation, newApplicant.szCertificateOfIncorporation, newApplicant.iTypeOfBunkering,
newApplicant.iZoneId, newApplicant.dLicenseDate, newApplicant.szImlBpCode, newApplicant.iTownId, newApplicant.iNewApplicant).FirstOrDefault();
int retPkid = Convert.ToInt16(newCrit.NewApplicant);
int pkid = Convert.ToInt32(retPkid);
string tblName = "psApplicant";
if (pkid > 0)
{
try
{
foreach (mApplications applicats in ObjApplicant)
{
mApplications newAppls = new mApplications();
newAppls.pkId = applicats.pkId;
newAppls.iApplicantId = pkid;
newAppls.iStageId = applicats.iStageId;
newAppls.iApplicationTypeId = applicats.iApplicationTypeId;
newAppls.iUserId = applicats.iUserId;
newAppls.szTransId = applicats.szTransId;
NPAEntities context2 = new NPAEntities();
var ret = context2.NPAAddApplication(newAppls.iApplicantId, newAppls.iStageId,
newAppls.iApplicationTypeId, newAppls.iUserId, newAppls.szTransId);
}
return ObjApplicant.Count();
}
catch (Exception ex)
{
NPAEntities context = new NPAEntities();
**context.NPAGenericDeleteValue(tblName, pkid);**
return -1;
}
}
}
catch (Exception)
{
return -1;
}
return ObjApplicant.Count();
}
私は、Web APIの闊歩を使用しています。私はそれを実行すると、最初のテーブルが移入されているし、2番目のテーブルが移入されていません。私は、次のコード行にブレークポイントを入れて、もう一度コードを実行しますと言っ
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<NPAAddApplication>("NPAAddApplication", iApplicantIdParameter, iStageIdParameter, iApplicationTypeIdParameter, iUserIdParameter, szTransIdParameter);
:
{ "データを
var ret = context2.NPAAddApplication(newAppls.iApplicantId, newAppls.iStageId,
newAppls.iApplicationTypeId, newAppls.iUserId, newAppls.szTransId);
は、今私はここにエラーが発生しましたリーダーが指定された 'NPAModel.NPAAddApplication'と互換性がありません。 'NewApplicationTransaction'タイプのメンバーに、同じ名前のデータリーダーに対応する 列がありません。 "}
応答体である-1と応答コードが200
通常応答本体が1であるべきであり、応答コードが200
次の行でありますのコードは、2番目の挿入ステートメントでエラーが発生した場合、最初のテーブルにデータが保存されないようにするものです。
context.NPAGenericDeleteValue(tblName, pkid);
その行をコメントアウト
はレスポンスボディで両方のテーブルのデータを保存します-1と応答コードが200
だから、それについてどんな考えですか?
申し訳ありませんが、私は言及するのを忘れてしまったことがあります。そのpkIdにpsApplicationTypeという別のテーブルがあります。したがって、渡されたiApplicationTypeIdがpsApplicationTypeテーブルに存在しない場合、すべて正常に動作します。レスポンスボディ1とレスポンスコード200です。しかし、それ以外の場合は、レスポンスボディ-1とレスポンスコード200が返されます。 – Somad