Проблемы с запросами SqlCommands ставят меня в тупик

#c# #sql #sql-server

#c# #sql #sql-сервер

Вопрос:

Я изо всех сил пытаюсь создать программу тестирования для своей базы данных.

Мое подключение к базе данных работает, и все, что я просто не могу заставить запросы работать. И я понятия не имею, как просмотреть результаты, возможно, в списке или что-то в этом роде.

Это то, что у меня есть до сих пор:

 public static string Query1()
{
    List<string[]> returnvalue = new List<string[]>();

    if (DatabaseConnection.OpenConnection())
    {
        try
        {              
            DatabaseConnection.OpenConnection();

            SqlCommand cmd = new SqlCommand("SELECT * FROM UniqueWeapon U, Weapon W WHERE W.WeaponID = U.WeaponIDFK AND U.AllyIDFK IS NOT NULL AND W.Damage > 10 AND W.WeaponType = 'Spell';", DatabaseConnection.connect);
            cmd.Connection = DatabaseConnection.connect;

            SqlDataAdapter dap = new SqlDataAdapter(cmd);

            DataTable tbl = new DataTable();
            dap.Fill(tbl);

            //cmd.CommandText = "SELECT * FROM UniqueWeapon U, Weapon W WHERE W.WeaponID = U.WeaponIDFK AND U.AllyIDFK IS NOT NULL AND W.Damage > 10 AND W.WeaponType = 'Spell';";
            //cmd.ExecuteNonQuery();             

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                dap.Fill(tbl);
            }
        }
        catch (SqlException e)
        {
            Console.WriteLine("Query Failed: "   e.StackTrace   e.Message.ToString());
            return "returnvalue";
        }
        finally
        {
            DatabaseConnection.CloseConnection();
        }
    }

    return "returnvalue";
}
  

Любая обратная связь или помощь были бы больны!

Спасибо!

Комментарии:

1. что вы имеете в виду под «я просто не могу заставить запросы работать» .. у вас есть ошибки? … неправильный результат? .. нет результатов? .. предоставьте образцы данных и ожидаемый результат

2. не похоже, что вы что-то делаете с результатами, чтобы «распечатать их в моем приложении», как говорится в вашей учетной записи sock puppet

3. Вы используете синтаксис соединения, устаревший более 20 лет назад. Вы нашли это на каком-то древнем веб-сайте? Вместо этого используйте правильные соединения ANSI : SELECT * FROM Weapon W JOIN UniqueWeapon U ON U.WeaponIDFK = W.WeaponID AND U.AllyIDFK IS NOT NULL WHERE W.Damage > 10 AND W.WeaponType = 'Spell' .

Ответ №1:

В вашем коде есть некоторые проблемы:

1) Использование метода DatabaseConnection.openConnection()

 if (DatabaseConnection.OpenConnection()) // means it's true with Connection to db
{
    try
    {              
        DatabaseConnection.OpenConnection(); // why you open it again
       .......
  

2) вы возвращаете фиктивную строку, и вы уже создали локальную таблицу данных, заполненную данными, но невидимую за пределами области действия метода

3) вы заполняете datatable дважды

4) вы не отслеживаете результаты с помощью Debug, чтобы узнать, в чем проблема

Измените свой код следующим образом: прочитайте мои комментарии в своем коде. Я создал класс DatabaseConnection для тестирования предоставленного кода, и он работает.

  public static DataTable Query1()
    {
       // why this variable returnvalue, you don't fill it
        List<string[]> returnvalue = new List<string[]>(); 

        //check the connection with database by using DatabaseConnection.OpenConnection() only once, and using the property Connect

        if (DatabaseConnection.connect.State == ConnectionState.Closed)
            DatabaseConnection.OpenConnection();

        DataTable tbl = new DataTable(); //use it as a return value

        try
        {
            SqlCommand cmd = new SqlCommand("SELECT * FROM UniqueWeapon U, Weapon W WHERE W.WeaponID = U.WeaponIDFK AND U.AllyIDFK IS NOT NULL AND W.Damage > 10 AND W.WeaponType = 'Spell';", DatabaseConnection.connect);

            cmd.Connection = DatabaseConnection.connect; //connect is SQlConnection

            SqlDataAdapter dap = new SqlDataAdapter(cmd);

            //DataTable tbl = new DataTable(); //use it as a return value
            dap.Fill(tbl);
            Debug.WriteLine(tbl.Rows.Count);
            //cmd.CommandText = "SELECT * FROM UniqueWeapon U, Weapon W WHERE W.WeaponID = U.WeaponIDFK AND U.AllyIDFK IS NOT NULL AND W.Damage > 10 AND W.WeaponType = 'Spell';";
            //cmd.ExecuteNonQuery();             

            //why that code, you already filled the table using SqlDataAdapter

            //SqlDataReader reader = cmd.ExecuteReader();

            //while (reader.Read())
            //{
            //    dap.Fill(tbl);
            //}

            // but if you want to fill datatable from Datareader use: tbl.Load(reader)
        }
        catch (SqlException e)
        {
            Console.WriteLine("Query Failed: "   e.StackTrace   e.Message.ToString());
            //return "returnvalue";
        }
        finally
        {
            DatabaseConnection.CloseConnection();
        }


        //return "returnvalue";
        return tbl;
    }