C#实体框架:临时返回空值的存储过程
我们试图使用一个实体通过存储过程写入我们的数据库,它正在工作,但是,存储过程也有一个输出来返回它刚刚插入的行的ID。我忽略了初始化所有传递的值,但我们的问题存在于以下代码中:C#实体框架:临时返回空值的存储过程,c#,sql-server,entity-framework,stored-procedures,C#,Sql Server,Entity Framework,Stored Procedures,我们试图使用一个实体通过存储过程写入我们的数据库,它正在工作,但是,存储过程也有一个输出来返回它刚刚插入的行的ID。我忽略了初始化所有传递的值,但我们的问题存在于以下代码中: ObjectParameter output = new ObjectParameter("cUSTOMER_ID", typeof(int)); var test = database.ADD_CUSTOMER_JSON(companyID, customerName, firstName, lastName, ad
ObjectParameter output = new ObjectParameter("cUSTOMER_ID", typeof(int));
var test = database.ADD_CUSTOMER_JSON(companyID, customerName, firstName, lastName, address_1, address_2, cityID, stateID, zipID, primaryPhoneNumber, alternatePhoneNumber, secondaryPhoneNumber, emailAddress, customerNotes, modifiedBy, output);
if(QuickBooksController.getTokens(companyID).Length > 0)
{
QuickBookCustomerQuery customer = GetCustomerDetailsForQuickBooks((int)output.Value);
QuickBooksController.CreateCustomer(companyID, customer, (int)output.Value);
}
当我们运行此代码时,我们得到一个错误,output.value
为空:
System.NullReferenceException:“对象引用未设置为对象的实例。”System.Data.Entity.CoreObjects.ObjectParameter.Value.get返回空值 我们在那里有一个断点,如果我们检查
output
的值,我们会看到它为null,但是如果我们等待几秒钟并检查它,那么它就有了值,并且数据会写入数据库。如果我们在那之后继续执行代码,那么它就工作了。我认为If
中的代码会被阻塞,直到SP完成并返回其值。我们在应用程序的其他地方使用完全相同的代码,没有问题。唯一的区别是var测试=…
之后会发生什么,有什么建议或想法吗?我们都被这件事难住了
存储过程:
ALTER PROCEDURE [dbo].[ADD_CUSTOMER_JSON]
@COMPANY_ID INT,
@CUSTOMER_NAME NVARCHAR(50) = '',
@FIRST_NAME NVARCHAR(50) = '',
@LAST_NAME NVARCHAR(50) = '',
@ADDRESS_1 NVARCHAR(100) = '',
@ADDRESS_2 NVARCHAR(100) = '',
@CITY_ID INT,
@STATE_ID INT,
@ZIP_CODE_ID INT,
@PRIMARY_PHONE_NUMBER NVARCHAR(50) = '',
@ALTERNATE_PHONE_NUMBER NVARCHAR(50) = '',
@SECONDARY_PHONE_NUMBER NVARCHAR(50) = '',
@EMAIL_ADDRESS NVARCHAR(100) = '',
@CUSTOMER_NOTES NVARCHAR(2500) = '',
@MODIFIED_BY NVARCHAR(50),
@CUSTOMER_ID INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CUSTOMER_BIRTHDATE DATE,
@DEFAULT_PERSON_NOTE NVARCHAR(50),
@CUSTOMER_ADDRESS_ID INT,
@CUSTOMER_ADDRESS_NOTES_ID INT,
@CUSTOMER_NOTES_ID INT = '',
@CUSTOMER_ADDRESS_NOTES NVARCHAR(2500) = '',
-- @CUSTOMER_NOTES NVARCHAR(2500) = '',
@CUSTOMER_PERSON_NOTE_ID INT,
@CUSTOMER_PERSON_ID INT
IF (@CUSTOMER_NAME = '')
BEGIN
SET @CUSTOMER_NAME = @LAST_NAME + ', ' + @FIRST_NAME
END
SET @CUSTOMER_BIRTHDATE = CONVERT(DATE, '1/1/1975')
SET @DEFAULT_PERSON_NOTE = 'PRIMARY CONTACT FOR ' + CAST(@CUSTOMER_NAME AS VARCHAR(50)) + '.'
EXEC DBO.GET_ADDRESS_ID_BY_ADDRESS_CITY_ID_STATE_ID_ZIP_CODE_ID
@ADDRESS_1 = @ADDRESS_1,
@ADDRESS_2 = @ADDRESS_2,
@CITY_ID = @CITY_ID,
@STATE_ID = @STATE_ID,
@ZIP_CODE_ID = @ZIP_CODE_ID,
@ADDRESS_ID = @CUSTOMER_ADDRESS_ID OUTPUT
IF (ISNULL (@CUSTOMER_ADDRESS_ID, 0) = 0)
BEGIN
EXEC [DBO].[ADD_ADDRESS]
@NOTES_ID = @CUSTOMER_ADDRESS_NOTES_ID,
@ADDRESS_1 = @ADDRESS_1,
@ADDRESS_2 = @ADDRESS_2,
@CROSS_STREET = '',
@CITY_ID = @CITY_ID,
@STATE_ID = @STATE_ID,
@ZIP_CODE_ID = @ZIP_CODE_ID,
@MODIFIED_BY = @MODIFIED_BY,
@ADDRESS_ID = @CUSTOMER_ADDRESS_ID OUTPUT
END
EXEC [DBO].[ADD_NOTES]
@NOTES = @CUSTOMER_NOTES,
@MODIFIED_BY = @MODIFIED_BY,
@NOTES_ID = @CUSTOMER_NOTES_ID OUTPUT
EXEC [DBO].[ADD_NOTES]
@NOTES = @CUSTOMER_ADDRESS_NOTES,
@MODIFIED_BY = @MODIFIED_BY,
@NOTES_ID = @CUSTOMER_ADDRESS_NOTES_ID OUTPUT
EXEC [DBO].[ADD_NOTES]
@NOTES = @DEFAULT_PERSON_NOTE,
@MODIFIED_BY = @MODIFIED_BY,
@NOTES_ID = @CUSTOMER_PERSON_NOTE_ID OUTPUT
EXEC [DBO].[ADD_PERSON]
@FIRST_NAME = @FIRST_NAME,
@LAST_NAME = @LAST_NAME,
@NOTE_ID = @CUSTOMER_PERSON_NOTE_ID,
@DATE_OF_BIRTH = @CUSTOMER_BIRTHDATE,
@PREFIX_ID = 0,
@SUFFIX_ID = 0,
@PRIMARY_PHONE = @PRIMARY_PHONE_NUMBER,
@PRIMARY_PHONE_EXT = '',
@ALTERNATE_PHONE = @ALTERNATE_PHONE_NUMBER,
@ALTERNATE_PHONE_EXT = '',
@CELL_PHONE = @SECONDARY_PHONE_NUMBER,
@MOBILE_PROVIDER_ID = NULL,
@FAX_NUMBER = '',
@EMAIL = @EMAIL_ADDRESS,
@MODIFIED_BY = @MODIFIED_BY,
@PERSON_ID = @CUSTOMER_PERSON_ID OUTPUT
INSERT INTO CUSTOMERS (COMPANY_ID,
QUICK_BOOKS_REFERENCE_NUMBER,
QUICK_BOOKS_LIST_ID,
QUICK_BOOKS_EDIT_SEQUENCE,
CUSTOMER_NAME,
DATE_REGISTERED,
NOTES_ID,
PAYCODE_ID,
PRIMARY_CONTACT_ID,
BILLING_ADDRESS_ID,
CUSTOMER_TYPE_ID,
CUSTOMER_FLAG_ID,
DEMOGRAPHICS_DESCRIPTOR,
IS_ACTIVE,
MODIFIED_BY)
VALUES (@COMPANY_ID,
0,
0,
'0',
@CUSTOMER_NAME,
GETDATE(),
@CUSTOMER_NOTES_ID,
1,
@CUSTOMER_PERSON_ID,
@CUSTOMER_ADDRESS_ID,
1,
1,
NULL,
1,
@MODIFIED_BY)
SELECT @CUSTOMER_ID = SCOPE_IDENTITY();
INSERT INTO CUSTOMER_ADDRESSES (CUSTOMER_ID,
ADDRESS_ID,
ADDRESS_TYPE_ID,
FROM_DATE,
MODIFIED_BY)
VALUES (@CUSTOMER_ID,
@CUSTOMER_ADDRESS_ID,
2,
GETDATE(),
@MODIFIED_BY)
SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE CUSTOMER_ID = @CUSTOMER_ID;
END
全功能
public ObjectResult<Nullable<int>> CreateCustomer([FromBody]dynamic customerInput)
{
var identity = (ClaimsIdentity)User.Identity;
var claimRole = identity.Claims.ToList()[0].Value.ToInt();
var claimCompany = identity.Claims.ToList()[3].Value.ToInt();
var claimUsername = identity.Claims.ToList()[5].Value.ToString();
int[] allowedRoles = new int[] { 1, 2, 3 , 8};
if (Array.IndexOf(allowedRoles, claimRole) != -1)
{
if (claimRole == 3 && claimCompany != (int)customerInput["COMPANY_ID"])
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
}
var companyID = (int)customerInput["COMPANY_ID"];
var customerName = customerInput["CUSTOMER_NAME"].ToString();
var firstName = customerInput["FIRST_NAME"].ToString();
var lastName = customerInput["LAST_NAME"].ToString();
var address_1 = customerInput["ADDRESS_1"].ToString();
var address_2 = customerInput["ADDRESS_2"].ToString();
var cityID = (int)customerInput["CITY_ID"];
var stateID = (int)customerInput["STATE_ID"];
var zipID = (int)customerInput["ZIP_CODE_ID"];
var primaryPhoneNumber = customerInput["PRIMARY_PHONE_NUMBER"].ToString();
var alternatePhoneNumber = customerInput["ALTERNATE_PHONE_NUMBER"].ToString();
var secondaryPhoneNumber = customerInput["SECONDARY_PHONE_NUMBER"].ToString();
var emailAddress = customerInput["EMAIL_ADDRESS"].ToString();
var customerNotes = customerInput["CUSTOMER_NOTES"].ToString();
var modifiedBy = claimUsername;
ObjectParameter output = new ObjectParameter("cUSTOMER_ID", typeof(int));
var test = database.ADD_CUSTOMER_JSON(companyID, customerName, firstName, lastName, address_1, address_2, cityID, stateID, zipID, primaryPhoneNumber, alternatePhoneNumber, secondaryPhoneNumber, emailAddress, customerNotes, modifiedBy, output);
if(QuickBooksController.getTokens(companyID).Length > 0)
{
// Do the quickbooks call to create the customer and update the DB with the quickbooks id
QuickBookCustomerQuery customer = GetCustomerDetailsForQuickBooks((int)output.Value);
QuickBooksController.CreateCustomer(companyID, customer, (int)output.Value);
}
return test;
}
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
}
public ObjectResult CreateCustomer([FromBody]动态customerInput)
{
var identity=(ClaimsIdentity)User.identity;
var claimRole=identity.Claims.ToList()[0].Value.ToInt();
var claimCompany=identity.Claims.ToList()[3].Value.ToInt();
var claimUsername=identity.Claims.ToList()[5].Value.ToString();
int[]allowedRoles=新的int[]{1,2,3,8};
if(Array.IndexOf(allowedRoles,claimRole)!=-1)
{
如果(claimRole==3&&claimCompany!=(int)customerInput[“公司ID”])
{
抛出新的HttpResponseException(新的HttpResponseMessage(HttpStatusCode.Unauthorized));
}
var companyID=(int)customerInput[“COMPANY_ID”];
var customerName=customerInput[“CUSTOMER_NAME”].ToString();
var firstName=customerInput[“FIRST_NAME”].ToString();
var lastName=customerInput[“LAST_NAME”].ToString();
var address_1=customerInput[“address_1”].ToString();
var address_2=customerInput[“address_2”].ToString();
var cityID=(int)customerInput[“CITY_ID”];
var stateID=(int)customerInput[“STATE_ID”];
var zipID=(int)customerInput[“邮政编码”\u ID];
var primaryPhoneNumber=customerInput[“PRIMARY_PHONE_NUMBER”]。ToString();
var alternatePhoneNumber=customerInput[“ALTERNATE_PHONE_NUMBER”]。ToString();
var secondaryPhoneNumber=customerInput[“SECONDARY_PHONE_NUMBER”]。ToString();
var emailAddress=customerInput[“EMAIL_ADDRESS”].ToString();
var customerNotes=customerInput[“CUSTOMER_NOTES”].ToString();
var modifiedBy=索赔用户名;
ObjectParameter输出=新的ObjectParameter(“cUSTOMER_ID”,typeof(int));
var test=database.ADD_CUSTOMER_JSON(companyID、customerName、firstName、lastName、address_1、address_2、cityID、stateID、zipID、primaryPhoneNumber、alternatePhoneNumber、secondaryPhoneNumber、emailAddress、customerNotes、modifiedBy、output);
if(QuickBooksController.getTokens(companyID).Length>0)
{
//执行quickbooks调用以创建客户并使用quickbooks id更新数据库
QuickBookCustomerQuery customer=GetCustomerDetailsForQuickBooks((int)output.Value);
CreateCustomer(companyID,customer,(int)output.Value);
}
回归试验;
}
抛出新的HttpResponseException(新的HttpResponseMessage(HttpStatusCode.Unauthorized));
}
添加\u客户\u JSON实体代码:
public virtual ObjectResult<Nullable<int>> ADD_CUSTOMER_JSON(Nullable<int> cOMPANY_ID, string cUSTOMER_NAME, string fIRST_NAME, string lAST_NAME, string aDDRESS_1, string aDDRESS_2, Nullable<int> cITY_ID, Nullable<int> sTATE_ID, Nullable<int> zIP_CODE_ID, string pRIMARY_PHONE_NUMBER, string aLTERNATE_PHONE_NUMBER, string sECONDARY_PHONE_NUMBER, string eMAIL_ADDRESS, string cUSTOMER_NOTES, string mODIFIED_BY, ObjectParameter cUSTOMER_ID)
{
var cOMPANY_IDParameter = cOMPANY_ID.HasValue ?
new ObjectParameter("COMPANY_ID", cOMPANY_ID) :
new ObjectParameter("COMPANY_ID", typeof(int));
var cUSTOMER_NAMEParameter = cUSTOMER_NAME != null ?
new ObjectParameter("CUSTOMER_NAME", cUSTOMER_NAME) :
new ObjectParameter("CUSTOMER_NAME", typeof(string));
var fIRST_NAMEParameter = fIRST_NAME != null ?
new ObjectParameter("FIRST_NAME", fIRST_NAME) :
new ObjectParameter("FIRST_NAME", typeof(string));
var lAST_NAMEParameter = lAST_NAME != null ?
new ObjectParameter("LAST_NAME", lAST_NAME) :
new ObjectParameter("LAST_NAME", typeof(string));
var aDDRESS_1Parameter = aDDRESS_1 != null ?
new ObjectParameter("ADDRESS_1", aDDRESS_1) :
new ObjectParameter("ADDRESS_1", typeof(string));
var aDDRESS_2Parameter = aDDRESS_2 != null ?
new ObjectParameter("ADDRESS_2", aDDRESS_2) :
new ObjectParameter("ADDRESS_2", typeof(string));
var cITY_IDParameter = cITY_ID.HasValue ?
new ObjectParameter("CITY_ID", cITY_ID) :
new ObjectParameter("CITY_ID", typeof(int));
var sTATE_IDParameter = sTATE_ID.HasValue ?
new ObjectParameter("STATE_ID", sTATE_ID) :
new ObjectParameter("STATE_ID", typeof(int));
var zIP_CODE_IDParameter = zIP_CODE_ID.HasValue ?
new ObjectParameter("ZIP_CODE_ID", zIP_CODE_ID) :
new ObjectParameter("ZIP_CODE_ID", typeof(int));
var pRIMARY_PHONE_NUMBERParameter = pRIMARY_PHONE_NUMBER != null ?
new ObjectParameter("PRIMARY_PHONE_NUMBER", pRIMARY_PHONE_NUMBER) :
new ObjectParameter("PRIMARY_PHONE_NUMBER", typeof(string));
var aLTERNATE_PHONE_NUMBERParameter = aLTERNATE_PHONE_NUMBER != null ?
new ObjectParameter("ALTERNATE_PHONE_NUMBER", aLTERNATE_PHONE_NUMBER) :
new ObjectParameter("ALTERNATE_PHONE_NUMBER", typeof(string));
var sECONDARY_PHONE_NUMBERParameter = sECONDARY_PHONE_NUMBER != null ?
new ObjectParameter("SECONDARY_PHONE_NUMBER", sECONDARY_PHONE_NUMBER) :
new ObjectParameter("SECONDARY_PHONE_NUMBER", typeof(string));
var eMAIL_ADDRESSParameter = eMAIL_ADDRESS != null ?
new ObjectParameter("EMAIL_ADDRESS", eMAIL_ADDRESS) :
new ObjectParameter("EMAIL_ADDRESS", typeof(string));
var cUSTOMER_NOTESParameter = cUSTOMER_NOTES != null ?
new ObjectParameter("CUSTOMER_NOTES", cUSTOMER_NOTES) :
new ObjectParameter("CUSTOMER_NOTES", typeof(string));
var mODIFIED_BYParameter = mODIFIED_BY != null ?
new ObjectParameter("MODIFIED_BY", mODIFIED_BY) :
new ObjectParameter("MODIFIED_BY", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<int>>("ADD_CUSTOMER_JSON", cOMPANY_IDParameter, cUSTOMER_NAMEParameter, fIRST_NAMEParameter, lAST_NAMEParameter, aDDRESS_1Parameter, aDDRESS_2Parameter, cITY_IDParameter, sTATE_IDParameter, zIP_CODE_IDParameter, pRIMARY_PHONE_NUMBERParameter, aLTERNATE_PHONE_NUMBERParameter, sECONDARY_PHONE_NUMBERParameter, eMAIL_ADDRESSParameter, cUSTOMER_NOTESParameter, mODIFIED_BYParameter, cUSTOMER_ID);
}
公共虚拟对象结果添加\u客户\u JSON(可为空的公司ID、字符串客户名称、字符串名字、字符串姓氏、字符串地址1、字符串地址2、可为空的城市ID、可为空的州ID、可为空的邮政编码ID、字符串主要电话号码、字符串备用电话号码、字符串次要电话号码、字符串电子邮件地址、字符串客户备注、字符串修改人、对象参数c)客户(ID)
{
var cOMPANY\u IDParameter=cOMPANY\u ID.HasValue?
新的ObjectParameter(“公司ID”,公司ID):
新的ObjectParameter(“COMPANY_ID”,typeof(int));
var cUSTOMER\u NAME参数=cUSTOMER\u NAME!=null?
新对象参数(“客户名称”,客户名称):
新的ObjectParameter(“客户名称”,类型(字符串));
var fIRST\u NAME参数=fIRST\u NAME!=null?
新的ObjectParameter(“FIRST_NAME”,FIRST_NAME):
新的ObjectParameter(“FIRST_NAME”,typeof(string));
var lAST\u NAME参数=lAST\u NAME!=null?
新的ObjectParameter(“姓氏”,姓氏):
新的ObjectParameter(“姓氏”,typeof(字符串));
变量地址\u 1参数=地址\u 1!=空?
新的ObjectParameter(“地址1”,地址1):
新的ObjectParameter(“ADDRESS_1”,typeof(string));
变量地址\u 2参数=地址\u 2!=空?
新的ObjectParameter(“地址2”,地址2):
新的ObjectParameter(“ADDRESS_2”,typeof(string));
var cITY\u IDParameter=cITY\u ID.HasValue?
新对象参数(“城市ID”,城市ID):
新的ObjectParameter(“CITY_ID”,typeof(int));
var sTATE_IDParameter=sTATE_ID.HasValue?
新的ObjectParameter(“STATE\u ID”,STATE\u ID):
新的ObjectParameter(“STATE_ID”,typeof(int));
var zIP\u CODE\u IDParameter=zIP\u CODE\u ID.HasValue?
新的ObjectParameter(“邮政编码ID”,邮政编码ID):
新的ObjectParameter(“ZIP_CODE_ID”,typeof(int));
var pRIMARY\u PHONE\u NUMBER参数=pRIMARY\u PHONE\u NUMBER!=空?
新的ObjectParameter(“主要电话号码”,主要电话号码):
新的ObjectParameter(“主电话号码”,typeof(字符串));
var aLTERNATE\u PHONE\u NUMBER参数=aLTERNATE\u PHONE\u NUMBER!=空?
新对象参数(“备用电话号码”,备用电话号码)