SqlDataAdapter не содержит конструктор для 3 аргументов - PullRequest
0 голосов
/ 18 сентября 2018

Пожалуйста, потерпите меня, но я получаю SqlDataAdapter, не содержащий конструктора для ошибки 3 аргументов, когда я пытаюсь передать следующий SQL-запрос.

SqlConnection con = new SqlConnection("Data Source = NY-L-WNORALES\\SQLEXPRESS; Initial Catalog = CCH_ENT; Integrated Security = True");
SqlDataAdapter sda = new SqlDataAdapter("SELECT CLIENTPARTNERSHIP.ClientIdent,CLIENTPARTNERSHIP.NameLine1,ClientType,ClientStatus,AddressLine1,Addr`essLine2,CityName,PostalCode,StateProvinceCode,BillManagerName,FirmClientStaffAssignmentName,StaffFirstName AS PartnerFirstName,StaffLastName AS PartnerLastName FROM CLIENTPARTNERSHIP JOIN CLIENT ON CLIENTPARTNERSHIP.ClientIdent = CLIENT.ClientIdent JOIN CLIENTADDRESS ON CLIENTPARTNERSHIP.ClientIdent = CLIENTADDRESS.ReferenceIdent JOIN CLIENTPRACTICE ON CLIENTPARTNERSHIP.ClientIdent = CLIENTPRACTICE.ClientIdent JOIN CLIENTCRS ON CLIENTPARTNERSHIP.ClientIdent = CLIENTCRS.ClientIdent JOIN STAFF ON STAFF.StaffIdent = CLIENTCRS.StaffIdent WHERE FirmClientStaffAssignmentName = 'Primary Partner' AND ClientSubId = '" + SearchBox.Text + "'", con + "UNION SELECT CLIENTCORP.ClientIdent,CLIENTCORP.NameLine1,Clientid,ClientSubId,ClientType,ClientStatus,AddressLine1,AddressLine2,CityName,PostalCode,StateProvinceCode,BillManagerName,FirmClientStaffAssignmentName,StaffFirstName AS PartnerFirstName,StaffLastName AS PartnerLastName FROM CLIENTCORP JOIN CLIENT ON CLIENTCORP.ClientIdent = CLIENT.ClientIdent JOIN CLIENTADDRESS ON CLIENTCORP.ClientIdent = CLIENTADDRESS.ReferenceIdent JOIN CLIENTPRACTICE ON CLIENTCORP.ClientIdent = CLIENTPRACTICE.ClientIdent JOIN CLIENTCRS ON CLIENTCORP.ClientIdent = CLIENTCRS.ClientIdent JOIN STAFF ON STAFF.StaffIdent = CLIENTCRS.StaffIdent WHERE FirmClientStaffAssignmentName = 'Primary Partner' AND ClientSubId = '" + SearchBox.Text + "'", con);

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Попробуйте, надеюсь, это поможет вам.

 SqlConnection con = new SqlConnection("Data Source = NY-L-WNORALES\\SQLEXPRESS; Initial Catalog = CCH_ENT; Integrated Security = True");
            SqlDataAdapter sda = new SqlDataAdapter("SELECT CLIENTPARTNERSHIP.ClientIdent,CLIENTPARTNERSHIP.NameLine1,ClientType,ClientStatus,AddressLine1,Addr`essLine2,CityName,PostalCode,StateProvinceCode,BillManagerName,FirmClientStaffAssignmentName,StaffFirstName AS PartnerFirstName,StaffLastName AS PartnerLastName FROM CLIENTPARTNERSHIP JOIN CLIENT ON CLIENTPARTNERSHIP.ClientIdent = CLIENT.ClientIdent JOIN CLIENTADDRESS ON CLIENTPARTNERSHIP.ClientIdent = CLIENTADDRESS.ReferenceIdent JOIN CLIENTPRACTICE ON CLIENTPARTNERSHIP.ClientIdent = CLIENTPRACTICE.ClientIdent JOIN CLIENTCRS ON CLIENTPARTNERSHIP.ClientIdent = CLIENTCRS.ClientIdent JOIN STAFF ON STAFF.StaffIdent = CLIENTCRS.StaffIdent WHERE FirmClientStaffAssignmentName = 'Primary Partner' AND ClientSubId = '" + " " + "' UNION SELECT CLIENTCORP.ClientIdent,CLIENTCORP.NameLine1,Clientid,ClientSubId,ClientType,ClientStatus,AddressLine1,AddressLine2,CityName,PostalCode,StateProvinceCode,BillManagerName,FirmClientStaffAssignmentName,StaffFirstName AS PartnerFirstName,StaffLastName AS PartnerLastName FROM CLIENTCORP JOIN CLIENT ON CLIENTCORP.ClientIdent = CLIENT.ClientIdent JOIN CLIENTADDRESS ON CLIENTCORP.ClientIdent = CLIENTADDRESS.ReferenceIdent JOIN CLIENTPRACTICE ON CLIENTCORP.ClientIdent = CLIENTPRACTICE.ClientIdent JOIN CLIENTCRS ON CLIENTCORP.ClientIdent = CLIENTCRS.ClientIdent JOIN STAFF ON STAFF.StaffIdent = CLIENTCRS.StaffIdent WHERE FirmClientStaffAssignmentName = 'Primary Partner' AND ClientSubId = '" + " " + "'", con);
0 голосов
/ 18 сентября 2018

Ваш sql полностью нечитаемый , поэтому довольно просто сделать простую ошибку (опечатку), которую трудно найти.Давайте сделаем sql чистым (пусть он будет читабельным и параметризованным ):

string sql = 
  @"SELECT CLIENTPARTNERSHIP.ClientIdent,
           CLIENTPARTNERSHIP.NameLine1,
           ClientType,
           ClientStatus,
           AddressLine1,
           AddressLine2,
           CityName,
           PostalCode,
           StateProvinceCode,
           BillManagerName, 
           FirmClientStaffAssignmentName,
           StaffFirstName AS PartnerFirstName,
           StaffLastName AS PartnerLastName 
      FROM CLIENTPARTNERSHIP JOIN 
           CLIENT ON CLIENTPARTNERSHIP.ClientIdent = CLIENT.ClientIdent JOIN 
           CLIENTADDRESS ON CLIENTPARTNERSHIP.ClientIdent = CLIENTADDRESS.ReferenceIdent JOIN 
           CLIENTPRACTICE ON CLIENTPARTNERSHIP.ClientIdent = CLIENTPRACTICE.ClientIdent JOIN 
           CLIENTCRS ON CLIENTPARTNERSHIP.ClientIdent = CLIENTCRS.ClientIdent JOIN 
           STAFF ON STAFF.StaffIdent = CLIENTCRS.StaffIdent 
     WHERE FirmClientStaffAssignmentName = 'Primary Partner' 
       AND ClientSubId = @prm_ClientSubId

     UNION 

    SELECT CLIENTCORP.ClientIdent,
           CLIENTCORP.NameLine1,
           Clientid,
           ClientSubId,
           ClientType,
           ClientStatus,
           AddressLine1,
           AddressLine2,
           CityName,
           PostalCode,
           StateProvinceCode,
           BillManagerName,
           FirmClientStaffAssignmentName,
           StaffFirstName AS PartnerFirstName,
           StaffLastName AS PartnerLastName
      FROM CLIENTCORP JOIN 
           CLIENT ON CLIENTCORP.ClientIdent = CLIENT.ClientIdent JOIN 
           CLIENTADDRESS ON CLIENTCORP.ClientIdent = CLIENTADDRESS.ReferenceIdent JOIN 
           CLIENTPRACTICE ON CLIENTCORP.ClientIdent = CLIENTPRACTICE.ClientIdent JOIN 
           CLIENTCRS ON CLIENTCORP.ClientIdent = CLIENTCRS.ClientIdent JOIN 
           STAFF ON STAFF.StaffIdent = CLIENTCRS.StaffIdent 
     WHERE FirmClientStaffAssignmentName = 'Primary Partner' 
       AND ClientSubId = @prm_ClientSubId";

Теперь все просто, верно?

 SqlDataAdapter sda = new SqlDataAdapter(sql, con);

 // Sorry: AddWithValue - easy (I don't know ClientSubId's type), but not the best   
 //TODO: change "AddWithValue" into "Add" and put actual ClientSubId's RDMBS type
 sda.SelectCommand.Parameters.AddWithValue("@prm_ClientSubId", SearchBox.Text);

Примечания: не жесткий код , а параметризация ваш запрос:

  1. Подумайте о SQL-инъекция : что еслиЯ положил "'; delete table Staff --" в SearchBox.Text.
  2. Подумайте о производительности : у вас будет много очень похожих запросов (вместо одного), которые будутанализируется каждый раз, когда вы их выполняете, кроме того, они будут помещаться в кэш анализируемых запросов и предотвращать кэширование других запросов
0 голосов
/ 18 сентября 2018

Причиной проблемы, с которой вы столкнулись, является то, что вы указали соединение (con) два раза при создании экземпляра адаптера.Но все же у вас проблемы, так как вы станете жертвой SQL-Injection, поэтому я настоятельно рекомендую вам использовать параметризацию.Вы можете попробовать что-то вроде следующего:

string querySql = "SELECT *query here* WHERE FirmClientStaffAssignmentName = 'Primary Partner' AND ClientSubId = @ClientSubId" +
                  " UNION SELECT *query here* WHERE FirmClientStaffAssignmentName = 'Primary Partner' AND ClientSubId = @UnionClientSubId";
using (SqlConnection con = new SqlConnection("Data Source = *******"))
{
    using (SqlCommand cmdSql = new SqlCommand(querySql, con))
    {
        cmdSql.Parameters.Add("@ClientSubId", SqlDbType.VarChar).Value = SearchBox.Text;
        cmdSql.Parameters.Add("@UnionClientSubId", SqlDbType.VarChar).Value = SearchBox.Text;
        using (SqlDataAdapter sda = new SqlDataAdapter(cmdSql)
        {
            sda.Fill(yourDataTable);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...