创建一个动态sqlite表创建和插入函数

时间:2018-05-22 06:25:30

标签: c# android sql sqlite xamarin

我有大约8-9个函数用于填充从SQL到Sqlite的表,我正在尝试创建一个动态函数,我将只传递一些参数,它将创建sqlite表(如果它不存在),在我想要在特定表中插入的类型的循环中创建多个实例,为其设置属性然后插入它。以下是示例函数:

private bool ReloadItemsFromServer()
    {
        try
        {
            using (GS.cnn)
            {
                SqlCommand command = new SqlCommand("rsp_FillItem_MobileDevice;", GS.cnn);
                command.CommandType = System.Data.CommandType.StoredProcedure;
                GS.cnn.Open();
                SqlDataReader reader = command.ExecuteReader();

                if (reader.HasRows)
                {
                    string dbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DataBase.PremierAndroid");
                    using (var sqliteConn = new SQLiteConnection(dbPath))
                    {
                        sqliteConn.CreateTable<Item>();

                        while (reader.Read())
                        {
                            {
                                var newItem = new Item();
                                newItem.ItemID = reader.GetInt32(0);
                                newItem.ItemBaseID = reader.GetInt32(1);
                                newItem.BrandID = reader.GetInt32(2);
                                newItem.Issue = reader.GetInt32(3);

                                sqliteConn.Insert(newItem);
                            }
                        }
                    }
                }
                else
                {
                    _dlgAlert = new AlertDialog.Builder(this).Create();
                    _dlgAlert.SetMessage(Resources.GetString(Resource.String.NoRowsForItemFound));
                    _dlgAlert.SetTitle(Resources.GetString(Resource.String.Error));
                    _dlgAlert.SetButton("OK", delegate { });
                    _dlgAlert.Show();
                    return false;
                }
                reader.Close();
            }
            return true;
        }
        catch (Exception ex)
        {
            _dlgAlert = new AlertDialog.Builder(this).Create();
            _dlgAlert.SetMessage(ex.Message);
            _dlgAlert.SetTitle(Resources.GetString(Resource.String.Error));
            _dlgAlert.SetButton("OK", delegate { });
            _dlgAlert.Show();
            return false;
        }
        finally
        {
            if (GS.cnn.State != ConnectionState.Closed)
            {
                GS.cnn.Close();
            }
        }
    }

又来了另一个:

private bool ReloadContragentsFromServer()
    {
        try
        {
            using (GS.cnn)
            {
                SqlCommand command = new SqlCommand("rsp_FillContragent_MobileDevice;", GS.cnn);
                command.CommandType = System.Data.CommandType.StoredProcedure;
                GS.cnn.Open();
                SqlDataReader reader = command.ExecuteReader();

                if (reader.HasRows)
                {
                    string dbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DataBase.PremierAndroid");
                    using (var sqliteConn = new SQLiteConnection(dbPath))
                    {
                        sqliteConn.CreateTable<Contragent>();

                        while (reader.Read())
                        {
                            {
                                var newContragent = new Contragent();
                                newContragent.ContragentID = reader.GetInt32(0);
                                newContragent.ContragentTypeID = reader.GetInt32(1);
                                newContragent.ContragentGroupID = reader.GetInt32(2);
                                newContragent.FullName = reader.GetString(3);
                                newContragent.BULSTAT = reader.GetString(4);
                                newContragent.ItemPriceGroupID = reader.GetInt32(5);
                                newContragent.ItemDiscountGroupID = reader.GetInt32(6);

                                sqliteConn.Insert(newContragent);
                            }
                        }
                    }
                }
                else
                {
                    _dlgAlert = new AlertDialog.Builder(this).Create();
                    _dlgAlert.SetMessage(Resources.GetString(Resource.String.NoRowsForContragentFound));
                    _dlgAlert.SetTitle(Resources.GetString(Resource.String.Error));
                    _dlgAlert.SetButton("OK", delegate { });
                    _dlgAlert.Show();
                    return false;
                }
                reader.Close();
            }
            return true;
        }
        catch (Exception ex)
        {
            _dlgAlert = new AlertDialog.Builder(this).Create();
            _dlgAlert.SetMessage(ex.Message);
            _dlgAlert.SetTitle(Resources.GetString(Resource.String.Error));
            _dlgAlert.SetButton("OK", delegate { });
            _dlgAlert.Show();
            return false;
        }
        finally
        {
            if (GS.cnn.State != ConnectionState.Closed)
            {
                GS.cnn.Close();
            }
        }
    }

你可以看到不同的东西。我怎么能这样做所以我只是调用一个方法并给它一些参数,所以我没有8-9块代码,这些代码有点重复?

我目前将此作为动态功能(未完成):

private bool LoadDataFromServer(string procedure, Type passedType)
    {
        try
        {
            using (GS.cnn)
            {
                SqlCommand command = new SqlCommand(procedure, GS.cnn);
                command.CommandType = System.Data.CommandType.StoredProcedure;
                GS.cnn.Open();
                SqlDataReader reader = command.ExecuteReader();

                if (reader.HasRows)
                {
                    string dbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DataBase.PremierAndroid");
                    using (var sqliteConn = new SQLiteConnection(dbPath))
                    {
                        sqliteConn.CreateTable(passedType);

                        while (reader.Read()) //to do > i++ bla bla
                        {
                            {
                                var newItem = Activator.CreateInstance(passedType);

                                //newItem - loop through properties and set = reader.get(int/string)(i)

                                sqliteConn.Insert(newItem);
                            }
                        }
                    }
                }
                else
                {
                    _dlgAlert = new AlertDialog.Builder(this).Create();
                    _dlgAlert.SetMessage(Resources.GetString(Resource.String.NoRowsForItemFound));
                    _dlgAlert.SetTitle(Resources.GetString(Resource.String.Error));
                    _dlgAlert.SetButton("OK", delegate { });
                    _dlgAlert.Show();
                    return false;
                }
                reader.Close();
            }
            return true;
        }
        catch (Exception ex)
        {
            _dlgAlert = new AlertDialog.Builder(this).Create();
            _dlgAlert.SetMessage(ex.Message);
            _dlgAlert.SetTitle(Resources.GetString(Resource.String.Error));
            _dlgAlert.SetButton("OK", delegate { });
            _dlgAlert.Show();
            return false;
        }
        finally
        {
            if (GS.cnn.State != ConnectionState.Closed)
            {
                GS.cnn.Close();
            }
        }
    }

谢谢

1 个答案:

答案 0 :(得分:0)

让反思并继承这样的帮助:

class Caller{

    // see how it sends objects to method 'processAllClasses' with different classes
    void main(){    
        ItemClass1 i1 = new ItemClass1();
        i1.setItemsB(1,2);
        processAllClasses(i1);

        ItemClass2 i2 = new ItemClass2();
        i2.setItemsB(10, 20);
        processAllClasses(i2);
    }

    //using reflection and inherit to process different classes, obj is what need to be processed on.
    //alternative way:
    //get members from the type, then assign values to them one by one
    void processAllClasses(ParentClass myobjvalue)
    { 
        Type realtype = myobjvalue.GetType();
        ParentClass myobj = new ParentClass(); 
        MethodInfo mi = realtype.GetMethod("setItemsA");
        object obj = Activator.CreateInstance(realtype);
        Object[] parameter = new Object[] { myobjvalue };
        mi.Invoke(obj, parameter); 
    }
}



class ParentClass {

}


class ItemClass1: ParentClass
{
    int ItemID;
    int ItemBaseID;
    public void setItemsA(ItemClass1 itemclass1)
    {
        this.ItemID = itemclass1.ItemID;
        this.ItemBaseID = itemclass1.ItemBaseID;
    }
    public void setItemsB(int ItemID, int ItemBaseID)
    {
        this.ItemID = ItemID;
        this.ItemBaseID = ItemBaseID;
    }

}

class ItemClass2 : ParentClass
{
    int ContragentID;
    int ContragentTypeID;
    public void setItemsA(ItemClass2 itemclass2)
    {
        this.ContragentID = itemclass2.ContragentID;
        this.ContragentTypeID = itemclass2.ContragentTypeID;
    }
    public void setItemsB(int ContragentID, int ContragentTypeID)
    {
        this.ContragentID = ContragentID;
        this.ContragentTypeID = ContragentTypeID;
    }

}