Получение сообщения об ошибке «Лучший перегруженный метод соответствует ... имеет недопустимые аргументы» - PullRequest
0 голосов
/ 24 февраля 2012

У меня проблемы со следующим кодом:

public class ClientGroupDetails
{
    public DateTime Col2;
    public String Col3;
    public Int32 Col4;

    public ClientGroupDetails(DateTime m_Col2, String m_Col3, Int32 m_Col4)
    {
        Col2 = m_Col2;
        Col3 = m_Col3;
        Col4 = m_Col4;
    }

    public ClientGroupDetails() { }
}

[WebMethod()]
public List<ClientGroupDetails> GetClientGroupDetails(string phrase)
{
    var client_group_details = new List<ClientGroupDetails>();

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
        using (command = new SqlCommand(@"select col2, col3, col4 from table1 where col1 = @strSearch", connection))
        {
            command.Parameters.Add("@strSearch", SqlDbType.VarChar, 255).Value = phrase;

            connection.Open();
            using (reader = command.ExecuteReader())
            {
                int Col2Index = reader.GetOrdinal("col2");
                int Col3Index = reader.GetOrdinal("col3");
                int Col4Index = reader.GetOrdinal("col4");

                while (reader.Read())
                {
                    client_group_details.Add(new ClientGroupDetails(
                        reader.IsDBNull(Col2Index) ? (Nullable<DateTime>)null : (Nullable<DateTime>)reader.GetDateTime(Col2Index),
                        reader.IsDBNull(Col3Index) ? null : reader.GetString(Col3Index),
                        reader.GetInt32(Col4Index)));
                }
            }
        }
    }

    return client_group_details;
}
}

Это дает мне следующую ошибку:

Compiler Error Message: CS1502: The best overloaded method match for 'Conflicts.ClientGroupDetails.ClientGroupDetails(System.DateTime, string, int)' has some invalid arguments
Line 184: client_group_details.Add(new ClientGroupDetails(

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Конструктор для ClientGroupDetails не принимает Nullable<DateTime> (он же DateTime?) - он принимает плоский DateTime. Вам нужно либо изменить то, что использует ClientGroupDetails, либо подумать о значении по умолчанию (может быть DateTime.MinValue).

Например ::

client_group_details.Add(new ClientGroupDetails(
    reader.IsDBNull(Col2Index) ? DateTime.MinValue : reader.GetDateTime(Col2Index),
    reader.IsDBNull(Col3Index) ? null : reader.GetString(Col3Index),
    reader.GetInt32(Col4Index)));

Или сохраните существующий код считывателя и измените POCO:

public class ClientGroupDetails
{
    public DateTime? Col2;
    ...    
    public ClientGroupDetails(DateTime? m_Col2, ...
    {
        Col2 = m_Col2;
        ...
    }   
    ...
}

В качестве альтернативы - используйте инструмент типа "dapper", который сделает все за вас:

var list = connection.Query<ClientGroupDetails>(
      @"select col2, col3, col4 from table1 where col1 = @phrase",
      new {phrase}).ToList();
2 голосов
/ 24 февраля 2012

make m_Col2 DateTime? (Nullable<DateTime>)

так, наконец, это будет так

public class ClientGroupDetails
{
    public Nullable<DateTime> Col2;
    public String Col3;
    public Int32 Col4;

    public ClientGroupDetails(Nullable<DateTime> m_Col2, String m_Col3, Int32 m_Col4)
    {
        Col2 = m_Col2;
        Col3 = m_Col3;
        Col4 = m_Col4;
    }

    public ClientGroupDetails() { }
}

[WebMethod()]
public List<ClientGroupDetails> GetClientGroupDetails(string phrase)
{
    var client_group_details = new List<ClientGroupDetails>();
    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
        using (command = new SqlCommand(@"select col2, col3, col4 from table1 where col1 = @strSearch", connection))
        {
            command.Parameters.Add("@strSearch", SqlDbType.VarChar, 255).Value = phrase;

            connection.Open();
            using (reader = command.ExecuteReader())
            {
                int Col2Index = reader.GetOrdinal("col2");
                int Col3Index = reader.GetOrdinal("col3");
                int Col4Index = reader.GetOrdinal("col4");

                while (reader.Read())
                {
                    client_group_details.Add(new ClientGroupDetails(
                        reader.IsDBNull(Col2Index) ? (Nullable<DateTime>)null : (Nullable<DateTime>)reader.GetDateTime(Col2Index),
                        reader.IsDBNull(Col3Index) ? (string)null : reader.GetString(Col3Index),
                        reader.GetInt32(Col4Index)));
                }
            }
        }
    }

    return client_group_details;
}
}

Кстати: я рекомендую вам 1. использовать свойства в вашем POCO вместо общедоступных переменных экземпляра и дать им значимые имена 2. использовать строчные имена локальных переменных

1 голос
/ 24 февраля 2012

Подпись ctor DataTime, и вы звоните с Nullable<DataTime>

public ClientGroupDetails(DateTime m_Col2, String m_Col3, Int32 m_Col4)

Вы назвали это с:

new ClientGroupDetails(
            reader.IsDBNull(Col2Index) ? (Nullable<DateTime>)null
        ...

Изменить ctor на:

public ClientGroupDetails(DateTime? m_Col2, string m_Col3, int m_Col4)

И имущество:

public DateTime? Col2;

Примечания:

  • Вам не нужно писать Int32, int является для него «псевдонимом».
  • То же самое с Nullable<DateTime> => DataTime? - это псевдоним.
...