Вставка данных в базу данных mysql с использованием C sharp Трехуровневая архитектура MVC (MysqlParameter вставляя нулевое значение) - PullRequest
0 голосов
/ 07 декабря 2018

Привет, ребята, здесь я получил cities таблица имеет 4 столбца cityId - это "AUTO_INCREMENT", cityName, governate, conId - ссылки на внешние ключи для countries таблицы

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

CREATE DEFINER=`root`@`localhost` PROCEDURE `addCity`(in  cityNamee varchar(45),bGovernate varchar(45),cconId int(5),out ccityId int(5))BEGIN insert into cities(`cityName`,`governate`,`conId`)values (@cityNamee,@bGovernate,@cconId);set @ccityId=last_insert_id();END

, когда sp вызывался из бизнес-уровня (контроллера) и передавал throw в модель, затем выполнял процедуру, вот модель для передачикоманда вставки, обновления, удаления

public void Transfare(string _chanPoro, MySqlParameter[] _dataContainer)
    {
        MySqlCommand transmeter = new MySqlCommand
        {
            CommandType = CommandType.StoredProcedure,
            CommandText = _chanPoro,
            Connection = dbcon
        };

        transmeter.Parameters.AddRange(_dataContainer);
        connect();
        transmeter.ExecuteNonQuery();
        disConnect();
    }

Я пытался вставить данные, используя MySqlParameter, но это всегда не удавалось и выдает ошибку

 public static void insertCity(string cityName, string governate, int countryId)
    {
        try
        {
                _socket = new _ctrlChannel();

                MySqlParameter[] zair = new MySqlParameter[4];


                zair[0] = new MySqlParameter("@cityNamee", MySqlDbType.VarChar, 45)
                { Value = cityName, Direction = ParameterDirection.Input
                };

                zair[1] = new MySqlParameter("@bGovernate", MySqlDbType.VarChar)
                { Value = governate, Direction = ParameterDirection.Input
                };

                zair[2] = new MySqlParameter("@cconId", MySqlDbType.VarChar)
                { Value = countryId, Direction = ParameterDirection.Input
                };

                zair[3] = new MySqlParameter("@ccityId", MySqlDbType.Int32,5)
                {  Direction = ParameterDirection.Output
                };

                _socket.connect();
                _socket.Transfare("addCity", zair);
                _socket.disConnect();
        }
        catch (MySql.Data.MySqlClient.MySqlException we) { MessageBox.Show("error" + we); }
    }

cityName не был найден в коллекции

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

  public static void insertNewCity(string cityName, string governate, int countryId)
    {
        try
        {
            _socket = new _ctrlChannel();

            _ctrlChannel.InitializeDb();
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = _ctrlChannel.dbcon;
            cmd.CommandText = "addCity";
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@cityNamee", cityName);
            cmd.Parameters["@cityNamee"].Direction = ParameterDirection.Input;

            cmd.Parameters.AddWithValue("@bGovernate", governate);
            cmd.Parameters["@bGovernate"].Direction = ParameterDirection.Input;

            cmd.Parameters.AddWithValue("@cconId", countryId);
            cmd.Parameters["@cconId"].Direction = ParameterDirection.Input;

            cmd.Parameters.AddWithValue("@ccityId", MySqlDbType.Int32);
            cmd.Parameters["@ccityId"].Direction = ParameterDirection.Output;
            _socket.connect();

            cmd.ExecuteNonQuery();

            _socket.disConnect();
        }
        catch (MySql.Data.MySqlClient.MySqlException we) { MessageBox.Show("error" + we); }
    }

Примечание. Процедура полностью работает, когда я тестировал ее на сервере

Это все, большое спасибо ...

1 Ответ

0 голосов
/ 11 декабря 2018

Убедитесь, что у вас есть getter и setter для сохранения значения из представления в бизнес-уровне, а затем бизнес-уровень доставляет в dataAccessLayer для вставки его в базу данных

    string _cityName;
    string _governate;
    int _countryId;
    private string cityName { get; set; }
    private string governate { get; set; }
    private int countryId { get; set; }

    public void prepare()
    {
        _cityName = cityName;
        _governate = governate;
        _countryId = countryId;
    }
    public  void insertCity( string _cityName ,string _governate, int _countryId)
    {
        try
        {
                _socket = new _ctrlChannel();

                MySqlParameter[] zair = new MySqlParameter[4];


                zair[0] = new MySqlParameter("@cityNamee", MySqlDbType.VarChar, 45)
                { Value = _cityName, Direction = ParameterDirection.Input
                };

                zair[1] = new MySqlParameter("@bGovernate", MySqlDbType.VarChar)
                { Value = _governate, Direction = ParameterDirection.Input
                };

                zair[2] = new MySqlParameter("@cconId", MySqlDbType.VarChar)
                { Value = _countryId, Direction = ParameterDirection.Input
                };

                zair[3] = new MySqlParameter("@ccityId", MySqlDbType.Int32,5)
                {  Direction = ParameterDirection.Output,Value=DBNull.Value
                };

            _socket.connect();
            _socket.Transfare("addCity", zair);
            _socket.disConnect();
        }
        catch (MySql.Data.MySqlClient.MySqlException we) { MessageBox.Show("error" + we); }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...