#c# #asp.net #code-behind #sqlconnection
#c# #asp.net #код за #sqlconnection
Вопрос:
Я заполняю таблицу данных из хранимой процедуры, а затем заполняю набор данных своей таблицей данных, но я получаю «Ссылка на объект не установлена для экземпляра объекта» в строке с ddl.DataSource = ds .
Как я могу решить мою привязку?
using (var scTyche = new SqlConnection(ConfigurationManager.ConnectionStrings["KondorConnectionConnectionString"].ConnectionString))
{
var ddl = (DropDownList)GridView1.FindControl("DropDownListFolders1");
var da = new SqlDataAdapter();
var dt = new DataTable();
var ds = new DataSet();
scTyche.Open();
var cmdTyche = scTyche.CreateCommand();
cmdTyche.CommandType = CommandType.StoredProcedure;
cmdTyche.CommandText = "dbo.spGetFolders";
cmdTyche.CommandTimeout = 60;
cmdTyche.Parameters.Add("@nBranchId", SqlDbType.Int).Value = intBranchId;
da.SelectCommand = cmdTyche;
da.Fill(dt);
ds.Tables.Add(dt);
ddl.DataSource = ds;
ddl.DataTextField = "strShort";
ddl.DataValueField = "nId";
ddl.DataBind();
cmdTyche.Parameters.Clear();
scTyche.Dispose();
scTyche.Close();
}
Комментарии:
1. Либо таблица не добавляется должным образом, либо
ddl
имеет значение null. Можете ли вы установить точку остановаvar ddl = ...
и перейти, чтобы увидеть сохраненное значениеddl
? Это поможет ответить на вопрос.2. проверьте, содержит ли ds таблицу, содержащую строки, или нет. вы можете попробовать так: если (ds. Таблицы [0].количество строк> 0)
3. @kumarch1 невозможно
ds
иметь значение null, поскольку он создал его экземплярnew DataSet()
. Возможно , что он пустой, но это не вызовет исключение NullReferenceException.4. @kumarch1 опять же, (что касается вашего редактирования), это не привело бы к возникновению исключения, о котором спрашивает OP … оно просто не отображало бы строк в выпадающем списке… наиболее вероятной причиной этого
ddl
является значение null, поэтому попытка получить доступ к егоDataSource
свойству приведет к появлению aNullReferenceException
.5. ddl был нулевым, я узнал сейчас
Ответ №1:
Обычно я просто заполняю набор данных из адаптера. ds содержит коллекцию таблиц. В зависимости от того, сколько наборов результатов возвращает ваш сохраненный процесс, это будет отражено в таблицах коллекции [0], Таблицах [1] и т. Д… В вашем случае я предполагаю, что он возвращает только 1. При таком подходе вам не нужна добавленная переменная DataTable.
Кроме того, dispose и close являются своего рода избыточными, поскольку оператор using точно предназначен для обработки этого через IDisposable интерфейс.
// example
da.Fill(ds);
if (ds.Tables.Count > 0)
{
ddl.Datasource = ds.Tables[0];
// etc....
}