locked
LINQ: Dynamic SQL Query within a dataset RRS feed

  • Question

  • User-1587537398 posted

    I have the following method that grabs a string, removes all spaces and add an OR for each word.

    string[] allWords = txtSearch.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    string sql = "SELECT Books.ISBN, Books.Title, Books.Tag, Books.Image, Books.photoType, Publishers.Name AS publisherName FROM Books INNER JOIN Publishers ON Books.codPublisher = Publishers.codPublisher WHERE ";
    using (SqlCommand command = new SqlCommand())
    {
    for (int i = 0; i < allWords.Length; ++i)
            {
                  if (i > 0)
                  sql += "OR ";
    
                  string paramName = "@param" + i.ToString();
                  sql += string.Format("(Books.Title LIKE {0}) ", paramName);
                  command.Parameters.AddWithValue(paramName, allWords[i] + "%");
             }
             command.CommandText = sql;
     }

    When I wanted to query my database I would simply do

    BooksTableAdapter tableAdapterBooks = new BooksTableAdapter();
    dataSetLibrary.BooksDataTable dataTableBooks;
    dataTableBooks = tableAdapterBooks.getDataByTitle(searchText);

    Seems like I cannot run SQL Commands within a DataSet. I have been told to use LINQ, but I have no ideia how to achieve this.

    Wednesday, April 15, 2015 7:36 AM

Answers

  • User-1587537398 posted

    After hours around this, I have come up with this solution.

    private SqlConnection sqlConn = new SqlConnection();
    private System.Data.DataSet dataSet = new System.Data.DataSet();
    private System.Data.DataTable dataTable;
    private System.Data.DataRow dataRow;
    
    private SqlCommand search(string searchParam, int searchOption)
            {
                SqlCommand command = new SqlCommand();
                string sql;
                string[] allWords = searchParam.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                if (searchOption == 1)
                {
                    sql = "SELECT Livros.ISBN, Livros.Titulo, Livros.Tema, Livros.Resumo, Livros.Imagem, Livros.fotoTipo, Editoras.Nome AS nomeEditora FROM Livros INNER JOIN Editoras ON Livros.codEditora = Editoras.codEditora WHERE ";
                }
                else
                {
                    sql = "SELECT Livros.ISBN, Livros.Titulo, Livros.Tema, Livros.Resumo, Livros.Imagem, Livros.fotoTipo, Editoras.Nome AS nomeEditora FROM Livros INNER JOIN livrosAutores ON Livros.ISBN = livrosAutores.ISBN INNER JOIN Autores ON livrosAutores.idAutor = Autores.idAutor INNER JOIN Editoras ON Livros.codEditora = Editoras.codEditora WHERE ";
                }
                using (command)
                {
                    for (int i = 0; i < allWords.Length; ++i)
                    {
                        if (i > 0)
                        {
                            sql += "OR ";
                        }
    
                        if (searchOption == 1)
                        {
                            sql += string.Format("(Livros.Titulo LIKE '%{0}%') ", allWords[i]);
                        }
                        else
                        {
                            sql += string.Format("(Livros.Autor LIKE '%{0}%') ", allWords[i]);
                        }
                    }
                    command.CommandText = sql;
                }
                return command;
            }
    
    protected void Bind()
            {
                    sqlConn.ConnectionString = Properties.Settings.Default.BibliotecaConnectionString;
                    string connectionString = sqlConn.ConnectionString.ToString();
                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(search(searchText, searchOption).CommandText, connectionString);
                    sqlDataAdapter.Fill(dataSet, "livrosTitulo");
                    dataTable = dataSet.Tables["livrosTitulo"];
                    dataGrid.DataContext = dataTable.DefaultView;
            }

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Wednesday, April 15, 2015 8:59 AM
  • User1711366110 posted

    After hours around this, I have come up with this solution.

       Glad to found the solution,
    you can also do with "Like" operator as below :

    private SqlCommand search(string searchParam, int searchOption)
            {
                ...
                using (command)
                {
                    for (int i = 0; i < allWords.Length; ++i)
                    {
                        if (i > 0)
                        {
                            sql += "OR ";
                        }
    
                        if (searchOption == 1)
                        {
                            sql += string.Format("(Livros.Titulo LIKE '{0}') ", "%"+allWords[i]+"%");
                        }
                        else
                        {
                            sql += string.Format("(Livros.Autor LIKE '{0}') ", "%"+allWords[i]+"%");
                        }
                    }
                    command.CommandText = sql;
                }
                return command;
            }
    

    --
    with regards,
    Edwin

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Thursday, April 16, 2015 1:38 AM

All replies

  • User-1587537398 posted

    After hours around this, I have come up with this solution.

    private SqlConnection sqlConn = new SqlConnection();
    private System.Data.DataSet dataSet = new System.Data.DataSet();
    private System.Data.DataTable dataTable;
    private System.Data.DataRow dataRow;
    
    private SqlCommand search(string searchParam, int searchOption)
            {
                SqlCommand command = new SqlCommand();
                string sql;
                string[] allWords = searchParam.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                if (searchOption == 1)
                {
                    sql = "SELECT Livros.ISBN, Livros.Titulo, Livros.Tema, Livros.Resumo, Livros.Imagem, Livros.fotoTipo, Editoras.Nome AS nomeEditora FROM Livros INNER JOIN Editoras ON Livros.codEditora = Editoras.codEditora WHERE ";
                }
                else
                {
                    sql = "SELECT Livros.ISBN, Livros.Titulo, Livros.Tema, Livros.Resumo, Livros.Imagem, Livros.fotoTipo, Editoras.Nome AS nomeEditora FROM Livros INNER JOIN livrosAutores ON Livros.ISBN = livrosAutores.ISBN INNER JOIN Autores ON livrosAutores.idAutor = Autores.idAutor INNER JOIN Editoras ON Livros.codEditora = Editoras.codEditora WHERE ";
                }
                using (command)
                {
                    for (int i = 0; i < allWords.Length; ++i)
                    {
                        if (i > 0)
                        {
                            sql += "OR ";
                        }
    
                        if (searchOption == 1)
                        {
                            sql += string.Format("(Livros.Titulo LIKE '%{0}%') ", allWords[i]);
                        }
                        else
                        {
                            sql += string.Format("(Livros.Autor LIKE '%{0}%') ", allWords[i]);
                        }
                    }
                    command.CommandText = sql;
                }
                return command;
            }
    
    protected void Bind()
            {
                    sqlConn.ConnectionString = Properties.Settings.Default.BibliotecaConnectionString;
                    string connectionString = sqlConn.ConnectionString.ToString();
                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(search(searchText, searchOption).CommandText, connectionString);
                    sqlDataAdapter.Fill(dataSet, "livrosTitulo");
                    dataTable = dataSet.Tables["livrosTitulo"];
                    dataGrid.DataContext = dataTable.DefaultView;
            }

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Wednesday, April 15, 2015 8:59 AM
  • User1711366110 posted

    After hours around this, I have come up with this solution.

       Glad to found the solution,
    you can also do with "Like" operator as below :

    private SqlCommand search(string searchParam, int searchOption)
            {
                ...
                using (command)
                {
                    for (int i = 0; i < allWords.Length; ++i)
                    {
                        if (i > 0)
                        {
                            sql += "OR ";
                        }
    
                        if (searchOption == 1)
                        {
                            sql += string.Format("(Livros.Titulo LIKE '{0}') ", "%"+allWords[i]+"%");
                        }
                        else
                        {
                            sql += string.Format("(Livros.Autor LIKE '{0}') ", "%"+allWords[i]+"%");
                        }
                    }
                    command.CommandText = sql;
                }
                return command;
            }
    

    --
    with regards,
    Edwin

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Thursday, April 16, 2015 1:38 AM