Нужно объявить скалярную переменную - почему не работает мой параметр? - PullRequest
0 голосов
/ 17 мая 2019

Я использую старый SqlClient для вставки некоторых данных с помощью цикла. Я правильно добавил все параметры, но получаю исключение, которое говорит

"Необходимо объявить скалярную переменную \" @ KeyProject \ "."

string query = @"INSERT INTO dbo.ImportedProjects 
                        (
                            KeyProject, 
                            KeyCompany, 
                            KeyCountry, 
                            KeyCustomer, 
                            KeyEmployeeProjectManager, 
                            KeyEmployeeProjectOwner, 
                            KeyOrganisation, 
                            ProjectNumber, 
                            ProjectName, 
                            ProjectOwnerNumber, 
                            ProjectManagerNumber, 
                            ProjectOwnerName, 
                            ProjectManagerName, 
                            ProjectOwnerInitials, 
                            ProjectManagerInitials, 
                            CustomerNumber, 
                            CustomerName, 
                            CreatedDate, 
                            ProjectStatus, 
                            ProjectOpenClosed
                        ) VALUES (
                            @KeyProject, 
                            @KeyCompany, 
                            @KeyCountry, 
                            @KeyCustomer, 
                            @KeyEmployeeProjectManager, 
                            @KeyEmployeeProjectOwner, 
                            @KeyOrganisation, 
                            @ProjectNumber, 
                            @ProjectName, 
                            @ProjectOwnerNumber, 
                            @ProjectManagerNumber, 
                            @ProjectOwnerName, 
                            @ProjectManagerName, 
                            @ProjectOwnerInitials, 
                            @ProjectManagerInitials, 
                            @CustomerNumber, 
                            @CustomerName, 
                            @CreatedDate, 
                            @ProjectStatus, 
                            @ProjectOpenClosed
                        )";

        SqlConnection sqlCon = new SqlConnection("Server=localhost;Database=DatabaseName;Trusted_Connection=True;");
        SqlCommand idInsertCms = new SqlCommand("SET IDENTITY_INSERT dbo.ImportedProjects ON", sqlCon);
        SqlCommand sqlCmd= new SqlCommand(query, sqlCon);

        try
        {
            sqlCon.Open();

            idInsertCms.ExecuteNonQuery();

            foreach (var item in importedProjects)
            {
                sqlCmd.Parameters.Add("@KeyProject", SqlDbType.Int);
                sqlCmd.Parameters["@KeyProject"].Value = item.KeyProject;
                sqlCmd.Parameters.Add("@KeyCompany", SqlDbType.Int);
                sqlCmd.Parameters["@KeyCompany"].Value = item.KeyCompany;
                sqlCmd.Parameters.Add("@KeyCountry", SqlDbType.Int);
                sqlCmd.Parameters["@KeyCountry"].Value = item.KeyCountry;
                sqlCmd.Parameters.Add("@KeyCustomer", SqlDbType.Int);
                sqlCmd.Parameters["@KeyCustomer"].Value = item.KeyCustomer;
                sqlCmd.Parameters.Add("@KeyEmployeeProjectManager", SqlDbType.Int);
                sqlCmd.Parameters["@KeyEmployeeProjectManager"].Value = item.KeyEmployeeProjectManager;
                sqlCmd.Parameters.Add("@KeyEmployeeProjectOwner", SqlDbType.Int);
                sqlCmd.Parameters["@KeyEmployeeProjectOwner"].Value = item.KeyEmployeeProjectOwner;
                sqlCmd.Parameters.Add("@KeyOrganisation", SqlDbType.Int);
                sqlCmd.Parameters["@KeyOrganisation"].Value = item.KeyOrganisation;
                sqlCmd.Parameters.Add("@ProjectNumber", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectNumber"].Value = item.ProjectNumber;
                sqlCmd.Parameters.Add("@ProjectName", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectName"].Value = item.ProjectName;
                sqlCmd.Parameters.Add("@ProjectOwnerNumber", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectOwnerNumber"].Value = item.ProjectOwnerNumber;
                sqlCmd.Parameters.Add("@ProjectManagerNumber", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectManagerNumber"].Value = item.ProjectManagerNumber;
                sqlCmd.Parameters.Add("@ProjectOwnerName", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectOwnerName"].Value = item.ProjectOwnerName;
                sqlCmd.Parameters.Add("@ProjectManagerName", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectManagerName"].Value = item.ProjectManagerName;
                sqlCmd.Parameters.Add("@ProjectOwnerInitials", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectOwnerInitials"].Value = item.ProjectOwnerInitials;
                sqlCmd.Parameters.Add("@ProjectManagerInitials", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectManagerInitials"].Value = item.ProjectManagerInitials;
                sqlCmd.Parameters.Add("@CustomerNumber", SqlDbType.VarChar);
                sqlCmd.Parameters["@CustomerNumber"].Value = item.CustomerNumber;
                sqlCmd.Parameters.Add("@CustomerName", SqlDbType.VarChar);
                sqlCmd.Parameters["@CustomerName"].Value = item.CustomerName;
                sqlCmd.Parameters.Add("@CreatedDate", SqlDbType.DateTime);
                sqlCmd.Parameters["@CreatedDate"].Value = item.CreatedDate;
                sqlCmd.Parameters.Add("@ProjectStatus", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectStatus"].Value = item.ProjectStatus;
                sqlCmd.Parameters.Add("@ProjectOpenClosed", SqlDbType.VarChar);
                sqlCmd.Parameters["@ProjectOpenClosed"].Value = item.ProjectOpenClosed;
                sqlCmd.Parameters.Clear();

                sqlCmd.ExecuteNonQuery();
            }

            idInsertCms.CommandText = "SET IDENTITY_INSERT dbo.ImportedProjects OFF";
            idInsertCms.ExecuteNonQuery();

Что не так с моим кодом?

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Как насчет создания нового SqlCommand для каждой итерации, например:

string query = @"INSERT INTO dbo.ImportedProjects 
                    (
                        KeyProject, 
                        KeyCompany, 
                        KeyCountry, 
                        KeyCustomer, 
                        KeyEmployeeProjectManager, 
                        KeyEmployeeProjectOwner, 
                        KeyOrganisation, 
                        ProjectNumber, 
                        ProjectName, 
                        ProjectOwnerNumber, 
                        ProjectManagerNumber, 
                        ProjectOwnerName, 
                        ProjectManagerName, 
                        ProjectOwnerInitials, 
                        ProjectManagerInitials, 
                        CustomerNumber, 
                        CustomerName, 
                        CreatedDate, 
                        ProjectStatus, 
                        ProjectOpenClosed
                    ) VALUES (
                        @KeyProject, 
                        @KeyCompany, 
                        @KeyCountry, 
                        @KeyCustomer, 
                        @KeyEmployeeProjectManager, 
                        @KeyEmployeeProjectOwner, 
                        @KeyOrganisation, 
                        @ProjectNumber, 
                        @ProjectName, 
                        @ProjectOwnerNumber, 
                        @ProjectManagerNumber, 
                        @ProjectOwnerName, 
                        @ProjectManagerName, 
                        @ProjectOwnerInitials, 
                        @ProjectManagerInitials, 
                        @CustomerNumber, 
                        @CustomerName, 
                        @CreatedDate, 
                        @ProjectStatus, 
                        @ProjectOpenClosed
                    )";

    SqlConnection sqlCon = new SqlConnection("Server=localhost;Database=DatabaseName;Trusted_Connection=True;");
    SqlCommand idInsertCms = new SqlCommand("SET IDENTITY_INSERT dbo.ImportedProjects ON", sqlCon);


    try
    {
        sqlCon.Open();

        idInsertCms.ExecuteNonQuery();

        foreach (var item in importedProjects)
        {
            SqlCommand sqlCmd= new SqlCommand(query, sqlCon);
            sqlCmd.Parameters.Add("@KeyProject", SqlDbType.Int);
            sqlCmd.Parameters["@KeyProject"].Value = item.KeyProject;
            sqlCmd.Parameters.Add("@KeyCompany", SqlDbType.Int);
            sqlCmd.Parameters["@KeyCompany"].Value = item.KeyCompany;
            sqlCmd.Parameters.Add("@KeyCountry", SqlDbType.Int);
            sqlCmd.Parameters["@KeyCountry"].Value = item.KeyCountry;
            sqlCmd.Parameters.Add("@KeyCustomer", SqlDbType.Int);
            sqlCmd.Parameters["@KeyCustomer"].Value = item.KeyCustomer;
            sqlCmd.Parameters.Add("@KeyEmployeeProjectManager", SqlDbType.Int);
            sqlCmd.Parameters["@KeyEmployeeProjectManager"].Value = item.KeyEmployeeProjectManager;
            sqlCmd.Parameters.Add("@KeyEmployeeProjectOwner", SqlDbType.Int);
            sqlCmd.Parameters["@KeyEmployeeProjectOwner"].Value = item.KeyEmployeeProjectOwner;
            sqlCmd.Parameters.Add("@KeyOrganisation", SqlDbType.Int);
            sqlCmd.Parameters["@KeyOrganisation"].Value = item.KeyOrganisation;
            sqlCmd.Parameters.Add("@ProjectNumber", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectNumber"].Value = item.ProjectNumber;
            sqlCmd.Parameters.Add("@ProjectName", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectName"].Value = item.ProjectName;
            sqlCmd.Parameters.Add("@ProjectOwnerNumber", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectOwnerNumber"].Value = item.ProjectOwnerNumber;
            sqlCmd.Parameters.Add("@ProjectManagerNumber", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectManagerNumber"].Value = item.ProjectManagerNumber;
            sqlCmd.Parameters.Add("@ProjectOwnerName", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectOwnerName"].Value = item.ProjectOwnerName;
            sqlCmd.Parameters.Add("@ProjectManagerName", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectManagerName"].Value = item.ProjectManagerName;
            sqlCmd.Parameters.Add("@ProjectOwnerInitials", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectOwnerInitials"].Value = item.ProjectOwnerInitials;
            sqlCmd.Parameters.Add("@ProjectManagerInitials", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectManagerInitials"].Value = item.ProjectManagerInitials;
            sqlCmd.Parameters.Add("@CustomerNumber", SqlDbType.VarChar);
            sqlCmd.Parameters["@CustomerNumber"].Value = item.CustomerNumber;
            sqlCmd.Parameters.Add("@CustomerName", SqlDbType.VarChar);
            sqlCmd.Parameters["@CustomerName"].Value = item.CustomerName;
            sqlCmd.Parameters.Add("@CreatedDate", SqlDbType.DateTime);
            sqlCmd.Parameters["@CreatedDate"].Value = item.CreatedDate;
            sqlCmd.Parameters.Add("@ProjectStatus", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectStatus"].Value = item.ProjectStatus;
            sqlCmd.Parameters.Add("@ProjectOpenClosed", SqlDbType.VarChar);
            sqlCmd.Parameters["@ProjectOpenClosed"].Value = item.ProjectOpenClosed;

            sqlCmd.ExecuteNonQuery();
        }

        idInsertCms.CommandText = "SET IDENTITY_INSERT dbo.ImportedProjects OFF";
        idInsertCms.ExecuteNonQuery();

SqlCommand sqlCmd= new SqlCommand(query, sqlCon);
sqlCmd.Parameters.Add("@KeyProject", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyCompany", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyCountry", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyCustomer", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyEmployeeProjectManager", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyEmployeeProjectOwner", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyOrganisation", SqlDbType.Int);
sqlCmd.Parameters.Add("@ProjectNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOwnerNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectManagerNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOwnerName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectManagerName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOwnerInitials", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectManagerInitials", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@CustomerNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@CustomerName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@CreatedDate", SqlDbType.DateTime);
sqlCmd.Parameters.Add("@ProjectStatus", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOpenClosed", SqlDbType.VarChar);

foreach (var item in importedProjects)
{
    sqlCmd.Parameters["@KeyProject"].Value = item.KeyProject;
    sqlCmd.Parameters["@KeyCompany"].Value = item.KeyCompany;
    sqlCmd.Parameters["@KeyCountry"].Value = item.KeyCountry;
    sqlCmd.Parameters["@KeyCustomer"].Value = item.KeyCustomer;
    sqlCmd.Parameters["@KeyEmployeeProjectManager"].Value = item.KeyEmployeeProjectManager;
    sqlCmd.Parameters["@KeyEmployeeProjectOwner"].Value = item.KeyEmployeeProjectOwner;
    sqlCmd.Parameters["@KeyOrganisation"].Value = item.KeyOrganisation;
    sqlCmd.Parameters["@ProjectNumber"].Value = item.ProjectNumber;
    sqlCmd.Parameters["@ProjectName"].Value = item.ProjectName;
    sqlCmd.Parameters["@ProjectOwnerNumber"].Value = item.ProjectOwnerNumber;
    sqlCmd.Parameters["@ProjectManagerNumber"].Value = item.ProjectManagerNumber;
    sqlCmd.Parameters["@ProjectOwnerName"].Value = item.ProjectOwnerName;
    sqlCmd.Parameters["@ProjectManagerName"].Value = item.ProjectManagerName;
    sqlCmd.Parameters["@ProjectOwnerInitials"].Value = item.ProjectOwnerInitials;
    sqlCmd.Parameters["@ProjectManagerInitials"].Value = item.ProjectManagerInitials;
    sqlCmd.Parameters["@CustomerNumber"].Value = item.CustomerNumber;
    sqlCmd.Parameters["@CustomerName"].Value = item.CustomerName;
    sqlCmd.Parameters["@CreatedDate"].Value = item.CreatedDate;
    sqlCmd.Parameters["@ProjectStatus"].Value = item.ProjectStatus;
    sqlCmd.Parameters["@ProjectOpenClosed"].Value = item.ProjectOpenClosed;

    sqlCmd.ExecuteNonQuery();
}

, или вы можете перезапустить sqlCmd и настроить параметры вне цикла, а затем просто установить их в цикле:

SqlCommand sqlCmd= new SqlCommand(query, sqlCon);
sqlCmd.Parameters.Add("@KeyProject", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyCompany", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyCountry", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyCustomer", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyEmployeeProjectManager", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyEmployeeProjectOwner", SqlDbType.Int);
sqlCmd.Parameters.Add("@KeyOrganisation", SqlDbType.Int);
sqlCmd.Parameters.Add("@ProjectNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOwnerNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectManagerNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOwnerName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectManagerName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOwnerInitials", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectManagerInitials", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@CustomerNumber", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@CustomerName", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@CreatedDate", SqlDbType.DateTime);
sqlCmd.Parameters.Add("@ProjectStatus", SqlDbType.VarChar);
sqlCmd.Parameters.Add("@ProjectOpenClosed", SqlDbType.VarChar);

foreach (var item in importedProjects)
{
    sqlCmd.Parameters["@KeyProject"].Value = item.KeyProject;
    sqlCmd.Parameters["@KeyCompany"].Value = item.KeyCompany;
    sqlCmd.Parameters["@KeyCountry"].Value = item.KeyCountry;
    sqlCmd.Parameters["@KeyCustomer"].Value = item.KeyCustomer;
    sqlCmd.Parameters["@KeyEmployeeProjectManager"].Value = item.KeyEmployeeProjectManager;
    sqlCmd.Parameters["@KeyEmployeeProjectOwner"].Value = item.KeyEmployeeProjectOwner;
    sqlCmd.Parameters["@KeyOrganisation"].Value = item.KeyOrganisation;
    sqlCmd.Parameters["@ProjectNumber"].Value = item.ProjectNumber;
    sqlCmd.Parameters["@ProjectName"].Value = item.ProjectName;
    sqlCmd.Parameters["@ProjectOwnerNumber"].Value = item.ProjectOwnerNumber;
    sqlCmd.Parameters["@ProjectManagerNumber"].Value = item.ProjectManagerNumber;
    sqlCmd.Parameters["@ProjectOwnerName"].Value = item.ProjectOwnerName;
    sqlCmd.Parameters["@ProjectManagerName"].Value = item.ProjectManagerName;
    sqlCmd.Parameters["@ProjectOwnerInitials"].Value = item.ProjectOwnerInitials;
    sqlCmd.Parameters["@ProjectManagerInitials"].Value = item.ProjectManagerInitials;
    sqlCmd.Parameters["@CustomerNumber"].Value = item.CustomerNumber;
    sqlCmd.Parameters["@CustomerName"].Value = item.CustomerName;
    sqlCmd.Parameters["@CreatedDate"].Value = item.CreatedDate;
    sqlCmd.Parameters["@ProjectStatus"].Value = item.ProjectStatus;
    sqlCmd.Parameters["@ProjectOpenClosed"].Value = item.ProjectOpenClosed;

    sqlCmd.ExecuteNonQuery();
}
0 голосов
/ 17 мая 2019

Вместо того, чтобы вставлять в цикл, вы можете использовать другой подход, попробуйте создать таблицу и добавить строки в эту таблицу со своими значениями, как только вы закончите добавление строк в эту таблицу, вы можете отправить эту таблицу в качестве параметра для вашего хранимой процедуры, в SQL Server создайте пользовательскую таблицу с теми же столбцами, что и ваша таблица, созданная в цикле, и используйте этот тип в качестве типа параметра, после этого вы можете выполнить вставку в таблицу, используя команду *

.
var newDataRow = medicareBuyInBuyInDataTable.NewRow();

foreach (var value in values) {
    newDataRow["FieldName"] = value;
    ....
    ....
}

yourDataTable.Rows.Add(newDataRow);

// send your table as parameter
 var parameter = new List<KeyValuePair<string, object>>{
                new KeyValuePair<string, object>("@yourTableParam", medicareBuyInDataTable)
            };
 return DbAccess.ExecuteScalar(ConString, StoredProcedureName, parameter);

В SQL Server создайте тип с теми же значениями в таблице, которую вы отправляете:

-- ================================
-- Create User-defined Table Type
-- ================================
USE <database_name, sysname, AdventureWorks>
GO

-- Create the data type
CREATE TYPE YourTableTypeName AS TABLE 
(
    <columns_in_primary_key, , c1> <column1_datatype, , int> <column1_nullability,, NOT NULL>, 
    <column2_name, sysname, c2> <column2_datatype, , char(10)> <column2_nullability,, NULL>, 
    <column3_name, sysname, c3> <column3_datatype, , datetime> <column3_nullability,, NULL>, 
    PRIMARY KEY (<columns_in_primary_key, , c1>)
)
GO

Наконец, в хранимой процедуре используйте созданный вами тип "YourTableTypeName"

CREATE PROCEDURE [dbo].[YourProcedureName]
    @yourTableParam [dbo].[YourTableTypeName] READONLY
AS
BEGIN
    INSERT INTO [dbo].[YourTable]
        SELECT * 
        FROM yourTableParam 
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...