У меня есть следующий код:
[HttpPost, Authorize]
public int AddLocation([FromBody]dynamic formBody)
{
List<object> parameters = new List<object>();
parameters.Add(new SqlParameter("companyID", (int)formBody.companyID));
parameters.Add(new SqlParameter("locationName", (string)formBody.locationName));
parameters.Add(new SqlParameter("locationCode", (string)formBody.locationCode));
parameters.Add(new SqlParameter("locationDescription", (string)formBody.locationDescription));
string addStmt = "INSERT INTO INV_LOCATIONS (NAME, CODE, DESCRIPTION, COMPANY_ID) OUTPUT inserted.ID VALUES (@locationName, @locationCode, @locationDescription, @companyID)";
var output = database.Database.SqlQuery<int>(addStmt, parameters);
var test = output.First();
SqlParameter[] parameters2 = {
new SqlParameter("locationID", output),
new SqlParameter("quantity", (int)formBody.quantity),
new SqlParameter("partID", (int)formBody.partID)
};
string SqlStatement = "INSERT INTO INV_QUANTITY (PART_ID, LOCATION_ID, QUANTITY) VALUES (@partID, @locationID, @quantity)";
var stmtExecute = database.Database.ExecuteSqlCommand(SqlStatement, parameters2);
return output.First();
}
Я не могу получить ВЫХОД или эту вставку в целом для запуска. Когда я копирую этот запрос непосредственно в SSMS и заменяю параметры переданными значениями, я получаю выведенный идентификатор, и создается новая строка. Я проверил все параметры, они есть и работают. Я делал что-то подобное раньше, и это сработало, но это не работает. Рабочая версия немного отличается, но я попробовал рабочий код, но он здесь не сработал.
Рабочий код:
string SqlStatement =
"IF NOT EXISTS (SELECT 1 FROM GLOBAL_CATEGORIES WHERE CATEGORY_NAME = @catName) " +
"BEGIN " +
"INSERT INTO GLOBAL_CATEGORIES (CATEGORY_NAME, MODIFIED_BY, DATE_CREATED, DATE_LAST_UPDATED) OUTPUT inserted.CATEGORY_ID VALUES (@catName, @modifiedBy, @date, @date)" +
"END " +
"ELSE SELECT CATEGORY_ID FROM GLOBAL_CATEGORIES WHERE CATEGORY_NAME = @catName";
object[] parameters =
{
new SqlParameter("catName", (string)formBody.catName),
new SqlParameter("modifiedBy", claimUsername),
new SqlParameter("date", date)
};
var globalID = database.Database.SqlQuery<int>(SqlStatement, parameters);
//var globalID = database.Database.ExecuteSqlCommand(SqlStatement, parameters);
SqlStatement = "INSERT INTO COMPANY_CATEGORIES (COMPANY_ID, CATEGORY_ID, SORT_ORDER, MODIFIED_BY, DATE_CREATED, DATE_LAST_UPDATED) VALUES (@companyID, @globalID, 0, @modifiedBy, @date, @date)";
SqlParameter[] parameters2 = {
new SqlParameter("modifiedBy", claimUsername),
new SqlParameter("date", date),
new SqlParameter("companyID", (int)formBody.companyID),
new SqlParameter("globalID", globalID.ToList().ToArray()[0])
};
В рабочей версии я сделал .ToList().ToArray()[0]
для получить значение. Я получаю следующую ошибку с кодом, который у меня есть сейчас, даже если я использую «рабочий» код:
System.ArgumentException: 'No mapping exists from object type System.Collections.Generic.List`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] to a known managed provider native type.'
Any Ideas? Я более чем счастлив поделиться более подробной информацией, если это поможет.