Процедура или функция AppendDataCT имеет слишком много аргументов - PullRequest
1 голос
/ 07 июня 2010

Я занимаюсь разработкой веб-приложения на C # VS 2008 / SQL Server. Я новичок в ASP.NET. Я получаю вышеуказанную ошибку компилятора. Можете ли вы дать мне совет, как это исправить?

Фрагмент кода:

    public static string AppendDataCT(DataTable dt, Dictionary<int, string> dic)
    {
        string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString;
        string errorMsg;

        try
        {
SqlConnection conn2 = new SqlConnection(connString);
SqlCommand cmd = conn2.CreateCommand();
cmd.CommandText = "dbo.AppendDataCT";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn2;
SqlParameter p1, p2, p3;
foreach (string s in dt.Rows[1].ItemArray)
{
    DataRow dr = dt.Rows[1]; // second row
    p1 = cmd.Parameters.AddWithValue((string)dic[0], (string)dr[0]);
    p1.SqlDbType = SqlDbType.VarChar;
    p2 = cmd.Parameters.AddWithValue((string)dic[1], (string)dr[1]);
    p2.SqlDbType = SqlDbType.VarChar;
    p3 = cmd.Parameters.AddWithValue((string)dic[2], (string)dr[2]);
    p3.SqlDbType = SqlDbType.VarChar;
}

conn2.Open();
cmd.ExecuteNonQuery();

Это ошибки в этой последней строке здесь.

А вот этот ИП:

ALTER PROCEDURE [dbo].[AppendDataCT] 
@col1 VARCHAR(50), 
@col2 VARCHAR(50),
@col3 VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TEMP DATETIME
SET @TEMP = (SELECT CONVERT (DATETIME, @col3))

INSERT INTO Person.ContactType (Name, ModifiedDate)
VALUES( @col2, @TEMP)
END

1 Ответ

1 голос
/ 07 июня 2010

Если ваш массив элементов содержит более 1 строки, это произойдет, потому что вы будете устанавливать число параметров = 3 * Нет строк в массиве элементов.

также вы не используете строку s, которую вы вытаскиваете в своем цикле.

похоже, здесь произошла какая-то эволюция.

вам нужно сестьвниз и выясните, хотите ли вы выполнить вставку несколько раз (сейчас вы выполняете только одну) или нет.

Существуют другие способы установить тип параметров, чтобы вам не понадобился p1, 2,3 переменных между прочим.

Я подозреваю, что вы хотите сделать что-то вроде этого

    public static string AppendDataCT(DataRow dr, Dictionary<int, string> dic) 
        { 


            string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
            string errorMsg; 

            try
            {
                SqlConnection conn2 = new SqlConnection(connString);
                SqlCommand cmd = conn2.CreateCommand();
                cmd.CommandText = "dbo.AppendDataCT";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn2;
                SqlParameter p1, p2, p3;

                    p1 = cmd.Parameters.AddWithValue((string) dic[0], (string) dr[0]);
                    p1.SqlDbType = SqlDbType.VarChar;
                    p2 = cmd.Parameters.AddWithValue((string) dic[1], (string) dr[1]);
                    p2.SqlDbType = SqlDbType.VarChar;
                    p3 = cmd.Parameters.AddWithValue((string) dic[2], (string) dr[2]);
                    p3.SqlDbType = SqlDbType.VarChar;
                    conn2.Open();
                    cmd.ExecuteNonQuery();
                    conn2.Close();

            }

, хотя эта строка

    foreach (string s in dt.Rows[1].ItemArray)

действительно озадачивает меня.... я думаю, что вы делаете что-то не так здесь - это ничего не говорит мне о том, что вы пытаетесь сделать, и кажется смущенным.Через 6 месяцев вы не поймете, как это работает.Более того, вызывающий может, вероятно, вести себя не так во многих отношениях, которые будут обнаружены только во время выполнения.

Почему бы просто не передать int, говорящий, сколько раз произойдет цикл?

Id также выполняетподсчет в словаре, чтобы подтвердить, что в нем 3 и только 3 элемента, потому что независимо от того, сколько раз вы зациклились, вы будете вставлять одни и те же 3 элемента.

почему бы не использовать словарь и использовать имя параметракак индекс?или перебрать список ключей в виде строк и таким образом добавить параметры?

что-то вроде этого

/// <summary>
        /// 
        /// </summary>
        /// <param name="dic">key = param name, val = param value</param>
        /// <returns></returns>
        public static string AppendDataCT(Dictionary<string, string> dic) 
    { 

        if (dic.Count !=3 )
            throw new ArgumentOutOfRangeException("dic can only have 3 parameters");

        string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
         // you probably want to do a string.IsNullOrEmpty(connString) and throw a ConfigurationException here is true to quickly identify this annoying bug ...


           using(SqlConnection conn2 = new SqlConnection(connString))
           {
            using( SqlCommand cmd = conn2.CreateCommand())
            {
            cmd.CommandText = "dbo.AppendDataCT";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn2;

            foreach (string s in dic.Keys)
            {                    
                SqlParameter  p = cmd.Parameters.AddWithValue(s, dic[s]);
                p.SqlDbType = SqlDbType.VarChar;
            }

            conn2.Open();
            cmd.ExecuteNonQuery();
            conn2.Close();
           }
           }
        }

этот код далеко не идеален, но может быть того, что вы имели в виду.

Если вы хотите сделать несколько вставок, то, возможно, рассмотрите list<dictionary<string,string>> или, что еще лучше, сделайте простую структуру для хранения параметров и списка структур и передайте их. Причина структуры / классааргументы в том, что он может проверять данные, чтобы защитить ваш метод от всевозможных неприятных данных, которые могут привести к его взрыву.Всегда приятно, чтобы кто-то другой кодекс вел себя, а не справлялся со всеми своими странными перестановками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...