Jagga Lyalpuria Ответов: 1

Каким образом я могу получить данные из var и вставить их в базу данных?


Я столкнулся с проблемой вызова данных для вставки в базу данных, но это не удалось. Это консольное приложение, которое сканирует данные веб-сайта. Теперь я хочу сохранить свои данные об этом обходе, стараясь изо всех сил, но не получая должного результата.Хотите показать эти данные
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using HtmlAgilityPack;
using System.Data.SqlClient;

namespace ZamenCrawler
{
    class Program
    {
        static void Main(string[] args)
        {

            SqlConnection con;
            string var;
              var name;
              var price;
              var image;
              var link;
            try
            {
                var = @"Data Source=.;Initial Catalog=WebCrawler;Integrated Security=True";
                con = new SqlConnection(var);
                con.Open();
                Console.WriteLine("DataBase Connected");
                string query = "Insert into details(Name,Price,Image,Link) VALUES ('" + name + "'," + price + "," + image + "," + link + ")";
                SqlCommand ins = new SqlCommand(query,con);
                ins.ExecuteNonQuery();
                Console.WriteLine("\n Data Stored in Database");
                string q = "Select * from CrawlerDetails";
                SqlCommand view = new SqlCommand(q, con);
                SqlDataReader dr = view.ExecuteReader();
                while (dr.Read())
                {
                    Console.WriteLine("Name:"+dr.GetValue(1).ToString());
                    Console.WriteLine("\nPrice:" + dr.GetValue(2).ToString());
                    Console.WriteLine("\nImage:" + dr.GetValue(3).ToString());
                    Console.WriteLine("\nLink:" + dr.GetValue(4).ToString());
                }
                con.Close();



            }
            catch (SqlException x)
            {
                Console.WriteLine(x.Message);

            }



            SrtartCrowlerAsync();

            Console.ReadLine();
        }

        private static async Task SrtartCrowlerAsync()
        {
            var url = "https://www.olx.com.pk/property-for-rent/";
            var httpClient = new HttpClient();
            var html = await httpClient.GetStringAsync(url);
            var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(html);
            var divs = htmlDocument.DocumentNode.Descendants("td")
                .Where(node => node.GetAttributeValue("class", "")
                .Equals("offer onclick  ")).ToList();
          

            var homes = new List<Home>();
            foreach (var td in divs)
            {
                var name = td?.Descendants("h3")?.FirstOrDefault()?.InnerText;
             
               var price = td?.Descendants("strong")?.FirstOrDefault()?.InnerText;

                var image = td?.Descendants("img")?.FirstOrDefault()?
                    .ChildAttributes("src")?.FirstOrDefault()?.Value;

                var link = td?.Descendants("a")?.FirstOrDefault()?
                    .ChildAttributes("href")?.FirstOrDefault()?.Value;

                var home = new Home
                {

                    Area = td?.Descendants("h3")?.FirstOrDefault()?.InnerText,
                 

                Price = td?.Descendants("strong")?.FirstOrDefault()?.InnerText,

                    Image = td?.Descendants("img")?.FirstOrDefault()?
                    .ChildAttributes("src")?.FirstOrDefault()?.Value,


                    Link = td?.Descendants("a")?.FirstOrDefault()?
                    .ChildAttributes("href")?.FirstOrDefault()?.Value,
                };
                homes.Add(home);
              
            }

        }
    }


    public class Home
    {
        public String Area { get; set; }
        public String Price { get; set; }
        public String Image { get; set; }
        public String Link { get; set; }


    }
}


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

SqlConnection con;
          string var;
            var name;
            var price;
            var image;
            var link;
          try
          {
              var = @"Data Source=.;Initial Catalog=WebCrawler;Integrated Security=True";
              con = new SqlConnection(var);
              con.Open();
              Console.WriteLine("DataBase Connected");
              string query = "Insert into details(Name,Price,Image,Link) VALUES ('" + name + "'," + price + "," + image + "," + link + ")";
              SqlCommand ins = new SqlCommand(query,con);
              ins.ExecuteNonQuery();
              Console.WriteLine("\n Data Stored in Database");
              string q = "Select * from CrawlerDetails";
              SqlCommand view = new SqlCommand(q, con);
              SqlDataReader dr = view.ExecuteReader();
              while (dr.Read())
              {
                  Console.WriteLine("Name:"+dr.GetValue(1).ToString());
                  Console.WriteLine("\nPrice:" + dr.GetValue(2).ToString());
                  Console.WriteLine("\nImage:" + dr.GetValue(3).ToString());
                  Console.WriteLine("\nLink:" + dr.GetValue(4).ToString());
              }
              con.Close();



          }
          catch (SqlException x)
          {
              Console.WriteLine(x.Message);

          }

Richard Deeming

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]

using (var con = new SqlConnection(@"Data Source=.;Initial Catalog=WebCrawler;Integrated Security=True"))
{
    con.Open();
    
    using (var ins = new SqlCommand("Insert into details(Name, Price, Image, Link) VALUES (@Name, @Price, @Image, @Link)", con))
    {
        ins.Parameters.AddWithValue("@Name", name);
        ins.Parameters.AddWithValue("@Price", price);
        ins.Parameters.AddWithValue("@Image", image);
        ins.Parameters.AddWithValue("@Link", link);
        
        ins.ExecuteNonQuery();
    }
    
    using (var view = new SqlCommand("Select Name, Price, Image, Link from CrawlerDetails", con))
    using (var dr = view.ExecuteReader())
    {
        while (dr.Read())
        {
            Console.WriteLine("Name:  {0}", dr["Name"]);
            Console.WriteLine("Price: {0}", dr["Price"]);
            Console.WriteLine("Image: {0}", dr["Image"]);
            Console.WriteLine("Link:  {0}", dr["Link"]);
        }
    }
}


Теперь вам просто нужно выяснить, какие значения вы хотели вставить, и действительно ли вы хотите вставить в одну таблицу и выбрать из другой таблицы!

Jagga Lyalpuria

является ли этот код написанным в основной функции?? Спасибо

Richard Deeming

Он заменяет код, который вы показали в своем вопросе.

Jagga Lyalpuria

Я сделал это, но ошибка приходит (имя, цена, изображение и ссылка не объявляются) в этой строке "ins.Параметр.AddWithValue();"

Richard Deeming

Это та же самая проблема, упомянутая в решении №1: Ваш код объявил переменные, но никогда не присваивал им значения.

Не зная, откуда берутся эти значения, мы не можем сказать вам, как исправить ваш код.

Jagga Lyalpuria

Я вставляю эти значения в одну таблицу

1 Ответов

Рейтинг:
12

OriginalGriff

Посмотрите, что вы делаете:

SqlConnection con;
string var;
  var name;
  var price;
  var image;
  var link;
try
{
    var = @"Data Source=.;Initial Catalog=WebCrawler;Integrated Security=True";
    con = new SqlConnection(var);
    con.Open();
    Console.WriteLine("DataBase Connected");
    string query = "Insert into details(Name,Price,Image,Link) VALUES ('" + name + "'," + price + "," + image + "," + link + ")";
    SqlCommand ins = new SqlCommand(query,con);
    ins.ExecuteNonQuery();
Какие значения у вас есть в ваших переменных, прежде чем вы попытаетесь вставить их в БД? Ничего. Это даже не будет компилироваться, а тем более работать, потому что система понятия не имеет, каким типом данных должны быть ваши переменные! Прекратить использование var все время ставьте какие-то значения в свои переменные,
и никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.


Jagga Lyalpuria

это мой первый раз, чтобы быть профессиональной работой, то plz поможет мне решить эту ошибку. можете ли вы прислать мне соответствующий и истинный код для моего понимания ... заранее спасибо

OriginalGriff

Нет, я не посылаю вам код: во всяком случае, я не могу, потому что понятия не имею, откуда вы должны получать свои данные.

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