Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Удалённое изменение строки подключения

Добрый день! Хочу задать тривиальный вопрос по строке подключения. Есть сервер, на нём крутится MS SQL Server 2008. Подключен через роутер, на котором сделан проброс портов на этот сервер. Есть приложение, клиентское, которое работает с данной БД. Подключение удалённое к БД. Внимание, вопрос: Если на сервере поменяется IP-адрес или порт подключения, как быстро у несколько сотен клиентов поменять строку подключения? Строка подключения прописана именно в классах, т.е. никаких app или config файлов! Как возможно и безопасно предусмотреть за ранее (Пока приложение на заверающей стадии разработки) изменение строки на клиентах?

Добавлено через 55 минут
И вообще, что можете предложить по этому поводу?

Добавлено через 1 минуту
При чём так, чтобы строка подключения была скрыта от посторонних глаз.
Ответ:
Сообщение от master_fatum
что можете предложить по этому поводу?
Предложить-то можно, вот только станете ли вы это реализовывать...
Сообщение от master_fatum
чтобы строка подключения была скрыта от посторонних глаз.
Да по сути, клиенты могут и вообще не иметь никакой информации. Если сделать серверное приложение на WCF (чтобы оно работало постоянно, а не с размещением в IIS/WAS), то можно в нем предусмотреть такую штуку, как WCF Discovery. Подключение к БД будет работать не напрямую, а именно через методы службы. Ну а что касается Discovery - это для того, чтобы все клиенты могли сами обнаруживать службу в сети, определять, соответствует ли она их критериям и получать ее адрес. В такой реализации у клиентов не то что строки к БД не будет, они и адреса службы до запуска знать не будут.
Вопрос: LocalDB. Обновление данных в DataGridView при изменении строки подключения

Доброго времени суток! Пытаюсь разобраться с LocalDB. Организовал метод, который в App.config меняет путь к базе *.mdf на такую же конструктивно, но заполненную другими данными (или пустую), а затем выводит данные в подключенный DataGridView. Все работает до первого вызова метода TableAdapter.Fill. После первого вызова Fill мой метод успешно меняет строку подключения, но повторный вызов Fill не обновляет данные в DataGridView. В этом, собственно, вся проблема. Нужно чтобы обновлялось, желательно без перезапуска программы. Может кто подскажет что делаю не так.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void SetDBPath(string _connectionString)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            foreach (XmlElement element in xmlDoc.DocumentElement)
            {
                if (element.Name.Equals("connectionStrings")) 
                {
                    foreach (XmlNode node in element.ChildNodes)
                    {
                        node.Attributes[1].Value = _connectionString;
                    }
                }
            }
            xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            ConfigurationManager.RefreshSection("connectionStrings");
            
            this.companyTableAdapter.Fill(this.testLocalDBDataDataSet.Company);
        }
Ответ: Igr_ok, Да. Впрочем, уже не важно. Все заработало. Спасибо Козадоев и Igr_ok.

Рабочий вариант:
C#
1
2
3
4
Properties.Settings.Default["TestLocalDBDataConnectionString"] = _connectionString;
Properties.Settings.Default.Save();
this.companyTableAdapter.Connection = new SqlConnection(_connectionString);
this.companyTableAdapter.Fill(this.testLocalDBDataDataSet.Company);
Вопрос: Обновление данных dataGridView в потоке ошибка BindingSource не может быть источником данных для самого себя

Изучаю потихоньку C#, требуется в отдельном потоке обновлять данные dataGridView. Если не выбирать ячейку или не прокручивать полосу прокрутки, то все работает нормально, иначе появляется эта ошибка :
"Исключение в DataGidView
System.InvalidOperationException : DindingSource не может быть источником данных для самого себя. Для свойств DataSource и DataMember нельзя установить значения, ссылающиеся на BindingSource."
Вот листинг:
Кликните здесь для просмотра всего текста

Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        bool work = true;
        BindingSource bS = new BindingSource();
        DataTable dT = new DataTable("Def");
        Thread thr=null;
 
        private void thrPr()
        {
            Random ran=new Random();
            while (work)
            {
                lock (dataGridView1)
                {
                    foreach (DataRow r in dT.Select())
                    {
                        r.BeginEdit();
                        r["nom"] = Convert.ToString(ran.Next(0,100));
                        r.EndEdit();
 
                    }
                }
                Thread.Sleep(1000);
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            dT.Columns.Add("Id", typeof(Int32));
            dT.Columns.Add("nom", typeof(String));
            dT.Columns["Id"].AutoIncrement = true;
            for(int i=10;i<110000;i++)
            {
                DataRow r = dT.NewRow();
                r["nom"] = Convert.ToString(i);
                dT.Rows.Add(r);
            }
            dataGridView1.DataSource = bS;
            bS.DataSource = dT;
            thr = new Thread(thrPr);
            thr.IsBackground = true;
            thr.Start();
 
        }
    }
}

Подскажите что делаю не так.
Ответ: Спасибо за объяснения. Помогло.
Вопрос: Изменение строки подключения к БД не изменяя проект в C#

Добрый день уважаемые коллеги.
Не получается изменить строку подключения к БД не изменяя проект.

Новую строку подключения ввожу в файле ProjectName.exe.config.
Перед подключением к БД, вывожу обновленную строку в лэйбл, выводится всё корректно, но подключения к БД нету.

Код на C#:

C#
1
2
3
4
5
6
7
8
9
10
11
            string str;
            ConnectionStringSettings Current_conf_str = ConfigurationManager.ConnectionStrings["name из app.config"];
            str = Current_conf_str.ConnectionString;
            
            Properties.Settings settings = Properties.Settings.Default;
            settings[""name из app.config"] = str;
            settings.Save();
 
            label3.Text = str;
            sql_conn = new SqlConnection(str);
            sql_conn.Open();
Подкскажите, что делаю не так ???
Ответ: Про AttachDbFileName ?? Неа, не писали....
Но именно это и помогло...

Огромное спасибо Вам за помощь и проявленное ТЕРПЕНИЕ !!!
Вопрос: Неверная строка подключения

Делаю курсовой проект с использованием ms sql и C#.
по книге "РАБОТА С БАЗАМИ ДАННЫХ
НА ЯЗЫКЕ C#
ТЕХНОЛОГИЯ ADO .NET
Учебное пособие
для студентов, обучающихся по специальности 08080165
Составители О. Н. Евсеева
А. Б. Шамшев"
пытаюсь подключить базу данных при помощи строки подключения, но при этом постоянно возникают ошибки
(наиболее часто: Additional information: [DBNETLIB][ConnectionOpen (Connect()).]SQL Server не существует, или доступ запрещен.)
Просмотрел кучу всего, в том числе и англоязычных форумов, но ни один совет не помог, пишу сюда в последней надежде
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;
 
namespace MuseumDatabase1_0
{
    public partial class MD_MainCurator : Form
    {
        public MD_MainCurator()
        {
            InitializeComponent();
            
           // OleDbConnectionStringBuilder ol = new OleDbConnectionStringBuilder();
          //  string connectionString = "Provider=SQLOLEDB ; Data Source= SIRAPRILPC;AttachDbFilename=MuseumDatabase1_0.mdf;Integrated Security=True;Connect Timeout=30";
          
           // string connectionString = "Provider=SQLOLEDB; Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\MuseumDatabase1_0.mdf;Integrated Security=True;Connect Timeout=30";
          //  string connectionString = "Provider=SQLOLEDB; Server=(LocalDB)\\MSSQLLocalDB;Database=|DataDirectory|\\MuseumDatabase1_0.mdf;Trusted_Connection=True;";
            string connectionString = "Provider=SQLOLEDB; Server=(LocalDB)\\MSSQLLocalDB\\|DataDirectory|\\MuseumDatabase1_0.mdf;Database=|DataDirectory|\\MuseumDatabase1_0.mdf;User Id=sa;Password=123;";
            OleDbConnection conn = new OleDbConnection(connectionString);
            OleDbCommand myCommand = new OleDbCommand();
           /* dim conn as New.System.Data.SqlClient.SqlConnection;
                conn.ConnectionString = connectionString;
            */
            myCommand.Connection = conn;
            string commandText = "SELECT * FROM Exponates";
            string commandText2 ="SELECT * " + "FROM [FormMusFonds]"; 
            myCommand.CommandText = commandText;
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
            dataAdapter.SelectCommand = myCommand;
            conn.Open();
            DataSet ds = new DataSet();
            dataAdapter.TableMappings.Add("Table", "Exponates");
            dataAdapter.Fill(ds);
            OleDbCommand myCommand2 = new OleDbCommand();
            myCommand2.Connection = conn;
            myCommand2.CommandText = commandText2;
            OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();
            dataAdapter2.SelectCommand = myCommand2;
            dataAdapter2.TableMappings.Add("Table", "FormMusFonds");
            dataAdapter2.Fill(ds);
 
            DataColumn dcExponatesToFormMusFondsID = ds.Tables["Exponates"].Columns["idFormMusFonds"];
            DataColumn dcFormMusFondsID =
            ds.Tables["FormMusFonds"].Columns["IDformMusFonds"];
            DataRelation dataRelation = new
            DataRelation("Addition Information", dcExponatesToFormMusFondsID, dcFormMusFondsID);
            ds.Relations.Add(dataRelation);
            DataViewManager dsview = ds.DefaultViewManager;
            dataGridView1.DataSource = dsview;
            dataGridView1.DataMember = "Exponates";
            conn.Close(); 
        }
 
        private void bindingNavigator2_RefreshItems(object sender, EventArgs e)
        {
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
 
        }
 
        private void MD_MainCurator_Load(object sender, EventArgs e)
        {
 
        }
    }
}
Пробовал все вышеперечисленные подключения.
Строка подключения, которая была указана при привязывании к BindingSource: Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MuseumDatabase1_0.mdf;Integrated Security=True;Connect Timeout=30
Ответ: Благодарю Вас, попробую, как только заработает, в этой теме добавлю работающий код для других=)
Вопрос: Программно изменить строку подключения

Здравствуйте!

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

Делаю так:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        public MainForm()
        {
            InitializeComponent();             
            Properties.Settings settings = Properties.Settings.Default;
            settings["borei"] = GetConnectionString();
        }
 
        private string GetConnectionString()
        {
            const string TEMPLATE_CONNECTION_STRING = @"Data Source={0};AttachDbFilename={1};Integrated Security={2};Connect Timeout={3}";
            const string TEMPLATE_PATH_TO_DATABASE = "{0}{1}\\{2}";
 
            const string DATA_SOURCE = "(LocalDB)\v11.0";
            const string INTEGRATED_SECURITY = "True";
            const string CONNECT_TIMEOUT = "30";
 
            const string DATABASE_FOLDER_NAME = "db";
            const string DATABASE_NAME = "main_db.mdf";
            
            string pathToCurrentFolder = Directory.GetCurrentDirectory();// = ...bin\\Debug
            int i = pathToCurrentFolder.IndexOf(Application.ProductName);
            string pathToSolutionFolder = pathToCurrentFolder.Substring(0, i);// = ...'Solutin name'\\
            string pathToDataBase = String.Format(TEMPLATE_PATH_TO_DATABASE,
                pathToSolutionFolder,
                DATABASE_FOLDER_NAME,
                DATABASE_NAME);
            string connectionString = String.Format(TEMPLATE_CONNECTION_STRING,
                DATA_SOURCE,
                pathToDataBase,
                INTEGRATED_SECURITY,
                CONNECT_TIMEOUT);
            return connectionString;
        }

получаю это:

App.config
Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="borei"
            connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\...\db\main_db.mdf;Integrated Security=True;Connect Timeout=30"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>


З.Ы. Самое приложение рабочее, т.е. данные из БД читаются хорошо.

Заранее спс!

//UPDATE
System.Configuration.Configuration как я понял устаревший и уменя его(в моей версии .NET) нету.
Ответ: Не знаю насколько это правильно, но вроде работает...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System.Data.SqlClient;
using System.Configuration;
 
static void Main()
        {
            ConnectionStrings();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form11());
        }
 
        static void ConnectionStrings()
        {
 
                SqlConnectionStringBuilder connect1 =
                    new SqlConnectionStringBuilder();
                connect1.DataSource = ""; // имя сервера
                connect1.InitialCatalog = ""; // имя базы данных
                connect1.IntegratedSecurity = true; //проверка подлинности через авторизацию Windows
                string conf_name = "" // название строки подключения из app.config
                ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings[conf_name];
                cs = new ConnectionStringSettings(conf_name, connect1.ConnectionString, "System.Data.SqlClient");
 
            System.Configuration.Configuration config =
                    ConfigurationManager.OpenExeConfiguration(
                    ConfigurationUserLevel.None);
            // Получаем доступ к строкам подключения
            ConnectionStringsSection csSection =
                config.ConnectionStrings;
            // заменяем строку подключения
            csSection.ConnectionStrings.Remove(cs.Name);
            csSection.ConnectionStrings.Add(cs);
            // сохранение файла конфигурации
            config.Save(ConfigurationSaveMode.Modified);
        }
Вопрос: DataGridView Добавление строк

Доброго времени суток.
Возможно ли в DataGridView добавить строки в то место где нужно мне, а не только в конец?
например у меня идут строки:
Кликните здесь для просмотра всего текста

1
3
5
8
10

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

1
2
3
4
5
6
7
8
9
10
Ответ: Ну грубо говоря, у менять есть данные в exel, но они идут с пропущенными значениями допустим идет список от 1 до 200 и пропущено несколько значений, я загружаю данные из exel в DataGridView и мне нужно заменить пропущенные значения пустыми строками. То есть должно быть всего 200 пунктов, а у меня 175 и эти пункты нужно добавить пустыми строками.
Вопрос: Ошибка при добавлении и обновлении данных

только недавно начала изучать mvc и создала тестовый проект, в котором изучаю все особенности. Столкнулась со сложностью, которую не могу преодолеть сама

Проблема в чем.

Я хочу на 1 страничке реализовать добавление, удаление, редактирование.

Например… есть данные роли:

Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public class Role
    {
 
        [Key]
        [HiddenInput(DisplayValue = false)]
        public int RoleId { get; set; }
 
        [Display(Name = "Наименование роли")]
        [Required(ErrorMessage = "Наименование роли должно быть установлено. Введите наименование, пожалуйста")]
        [MaxLength(30, ErrorMessage = "Превышена максимальная длина для наименования в 30 символов. Исправьте, пожалуйста")]
        [MinLength(2, ErrorMessage = "Минимальная длина наименования 2 символа. Исправьте, пожалуйста")]
        public string Name { get; set; }
 
        //  [HiddenInput(DisplayValue = false), UIHint("")]
        [HiddenInput(DisplayValue = false)]
        [Display(Name = "Дата регистрации")]
        [DataType(DataType.DateTime)]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy H:mm:ss}", ApplyFormatInEditMode = true)]
        public DateTime RoleAdd { get; set; }
 
 
}

столкнулась с тем, что если нет на форме RoleId и RoleAdd, то не работает Обновление (объект роли не передается в метод полностью), а если на форме есть эти 2 поля, то добавление не работает, так как ModelState.IsValid в состоянии не валидном (не проставляется на этом этапе дата добавления и Id)

создала тестовый пример... я только недавно в ASP MVC, поэтому можете меня ругать, если что не так замутила =)

создала 2 странички:
Service/Roles1 - не добавлены поля RoleId и RoleAdd. Тут не работает обновление
Service/Roles2 - добавлены поля RoleId и RoleAdd. Тут не работает добавление


з.ы. пока не умею скрывать кнопки, поэтому сразу 2 кнопки на странице (для добавления и обновления данных).


буду оч рада, если поможете =) спасибо =)
Ответ:
Цитата Сообщение от Eugene22 Посмотреть сообщение
может не надо все усложнять, и сначала надо научиться делать на разных формах.
Чтобы все сделать на одной форме, то придется в контроллере при получении объекта из формы смотреть, установлен ли у него id, если id >0, то обновление, иначе добавление. Либо можно сделать форму с тремя кнопками и смотреть, какая кнопка была нажата.
Добавление в данном случае почему не работает, наверное потому что дата в RoleAdd в неправильном формате - тут лучше использовать виджет jquery DataPicker. Если вам это свойство не важно, определите его как Nullable - DateTime?
А при обновлении и удалении должны быть установлено поле Id
это все понятно и по кускам все отлично работает. научилась. Я хочу усложнить и постараться сделать много действий на 1 форме, но что-то не очень все работает.

я прикрепила проект же вчера специально =)

описываю немного детальней. поля RoleId, RoleAdd в скрытом состоянии [HiddenInput(DisplayValue = false)]. Мне они не нужны для редактирования и заполнения. Нужно чтобы заполнялись автоматом (id и дата регистрации). Хочу только изменять наименование.
На форме: параметры заполнения для новых данных, таблица с внесенными данными и есть кнопка добавления, изменения, редактирования, удаления, сортировки (см. проект)

вариант 1:
на странице есть RoleId (не отображается, но оно есть), RoleAdd (не отображается, но оно есть), Name.

В этом случае при добавлении в контроллере приходит: RoleId=0, RoleAdd = '01.01.0001 00:00:00' приходят нули и только нормальное наименование, поэтому в контроллере сразу срабатывает ModelState.IsValid, так как он передает состояние false (нули же пришли в значениях. это не круто. и если поместить валидаторы, то они выдадут как раз ошибки по этим параметрам)

В этом случае при обновлении данных все гуд. Целый объект Role передается без багов и тд так как все поля есть на странице и они как бы заполнены


вариант 2:
на странице есть Name только.

В этом случае при добавлении все гуд. Дату проставляю в контроллере, Id автоматом подставляется. ошибок нет

В этом случае при обновлении в контроллере приходит: RoleId=0, RoleAdd = '01.01.0001 00:00:00'. приходят нули и только нормально наименование, поэтому в контроллере сразу ругается на обновлен непонятных данных (не знает чего обновлять)


я просто зависла над вопросам и не знаю как выйти из это ситуации =) а-а-а-а-а-а...

Добавлено через 1 час 50 минут
если прописать в классе

Код C#
1
2
3
4
5
6
7
8
9
10
11
12
public class Role{
 
 private DateTime currentDate = DateTime.Now;
 
.... 
 
 public Role()
        {
                 RoleAdd = currentDate;
                 RoleId =100;
        }
}
и на странице все элементы, то добавление прокатывает. В БД RoleId не 100 попадает, а нужный Id проставляется. обновление не прокатывает
Вопрос: Как распечатать данные DataGridView как отчет

Привет! Как распечатать данные datagridview как отчет
Ответ: Сформировать отчет
Данные в DGV как попадают? Из БД? Тогда элемент Report или CrystalReport, что есть. Настраиваешь в конструкторе студии внешний вид будущего отчета и все. С помощью ReportViewer (это контрол такой) можно организовать предварительный просмотр отчета.
Как вариант, создать в виде гипертекста форму отчета и ее запонять данными вручную (ну не совсем вручную, просто написать функцию для формирования отчета). Отдельные куски конечной веб-странички (ведь именно ее ты формируешь) хранить в ресурсах приложения в строках. А при формировании отчета собирать из этих кусков и данных вперемешку тело странички. Тут очень удобно, например, использовать SharePoint или другой визуальный редактор веб-страниц. Делаешь в нем пустографку, смотришь код страницы и думаешь, как тебе его правильно подерибанить, чтоб потом удобно компоновать таблицу(ы) отчета. Ничего сложного, просто рутинное занятие. Ну а просмотр и печать - через webbrowser (контрол такой) проще всего.
Вопрос: Защита строки подключения

Подскажите пожалуйста, как защитить строку подключения, а именно пароль, логин который прописывается в программе при обращение к бд.
Думал может как вариант делать запрос к какому нибудь php файлу на сервере, а php уже делал запрос к бд. Но чёт думаю как то геморно это все. Есть же вариант проще я так думаю. Либо шифровать строку?
Ответ: Да вроде бы все понятно описал. Нужно защитить подключение через клиента( приложение на ПК ) к базам данных. Куда еще подробнее то?
Ограничивать права, это лишнее. Так как за получение к доступу к этим базам клиент будет платить, соответственно, даже ограничив доступ к правам БД, взломать все равно смогут, если в клиенте будет в коде прописана строка подключения. Вот и задался вопросом как защитить ее. Базы данных соответственно находятся на хостинге.