Member 14530922 Ответов: 2

Моя ошибка заключается в том, что я не могу имплицитно преобразовать system.data.datatable в строку



я использую идентификатор источника данных в GridView и получаю сообщение об ошибке в привязке данных, когда я использую GridView2.Источник данных = ДТБ и когда я использую datasourceid, чтобы добавить ДТБ я получаю ошибку
не удается имплицитно преобразовать system.data.datatable в строку


Что я уже пробовал:

string maincon = ConfigurationManager.ConnectionStrings["IA_AutoConnectionStrin"].ConnectionString;
          SqlConnection sqlcon = new SqlConnection(maincon);

SqlDataAdapter ss = new SqlDataAdapter("select * from [AUDIT_UNIVERSE] where (O_CODE like '" + ((DropDownList6.SelectedItem.Value == "") ? "%%" : DropDownList6.SelectedItem.Value) + "') AND (ENTITY_CODE like '" + ((TextBox2.Text == "") ? "%%" : TextBox2.Text) + "') AND (ENTITY_NAME like '" + ((TextBox4.Text == "") ? "%%" : TextBox4.Text) + "') AND (ENTITY_SCOPE like '" + ((TextBox7.Text == "") ? "%%" : TextBox7.Text) + "') AND (ENTITY_STATKEHOLDERS like '" + ((TextBox8.Text == "") ? "%%" : TextBox8.Text) + "') AND (ZONE_AREA like '" + ((TextBox3.Text == "") ? "%%" : TextBox3.Text) + "') AND (IT_OPS like '" + ((TextBox6.Text == "") ? "%%" : TextBox6.Text) + "') AND (STATUS like '" + ((DropDownList7.SelectedItem.Value == "") ? "%%" : DropDownList7.SelectedItem.Value) + "')  AND (USER_ID like '" + ((TextBox9.Text == "") ? "%%" : TextBox9.Text) + "')   AND (DATE like '" + ((TextBox10.Text == "") ? "%%" : TextBox10.Text) + "') ", sqlcon);

GridView2.DataSourceID = "SqlDataSource1";
           

            DataTable dtb = new DataTable();

ss.Fill(dtb);
          sqlcon.Close();

GridView2.DataSourceID =    dtb;
           GridView2.DataBind();

2 Ответов

Рейтинг:
0

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

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

Сделайте себе одолжение и прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам нужно будет изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...

Теперь проблема, которую вы заметили:

DataSourceID является строковым идентификатором для элемента управления источником данных, предоставляемого .NET, и это свойство существует для того, чтобы связанный с данными элемент управления и соответствующий источник данных могли быть связаны во время разработки в разметке. Внутренне элемент управления будет искать фактический элемент управления источником данных, используя предоставленный идентификатор. DataTable не является идентификатором, и неявная ToString установит идентификатор в "System.Data.DataTable", а не содержимое, даже если это было разрешено!
DataSource ссылается на фактический объект источника данных, который может быть элементами управления источником данных, предоставляемыми .NET, или фактическими объектами данных, такими как DataTable. Это та собственность, которую вы хотели.


Member 14530922

я хочу использовать как идентификатор источника данных, так и источник данных в моем gridview, но это дает мне ошибку

OriginalGriff

Нет, это не так. Gridview имеет только один источник данных: вы не можете дать ему два!

Рейтинг:
0

Maciej Los

Короче говоря: проблема здесь:

GridView2.DataSourceID = "SqlDataSource1";

но не здесь:
GridView2.DataSourceID = dtb;


Вы не можете установить DataSource свойство GridView to string. Это должен быть предмет!

С другой стороны, Объект dataadapter.Заполнить[^ имеет 4 перегрузок. Fill метод с одним аргументом заполняет a DataSet объект.

Итак, если вы хотите вернуть один объект datatable, вы должны использовать что-то вроде этого:
using(SqlDataAdapter ss = new SqlDataAdapter(your_query_goes_here))
{
    DataSet ds = new DataSet()
    ss.Fill(ds)
    GridView2.DataSource = ds.Tables[0];
}

или:
using(SqlConnection connection = new SqlConnection(conn_string_here))
    using(SqlCommand command = new SqlCommand(your_query_goes_here, connection))
    {
        connection.Open();
        using(SqlDataReader reader = command.ExecuteReader())
        {
            DataTable dt = new DataTable()
            dt.Load(reader)
            GridView2.DataSource = dt;
        }
    }


В конце концов, но самое важное замечание: ваш sql-запрос уродлив и уязвим для sql-инъекций.