C# Can';t在Xamarin.Forms上使用System.Data.SqlClient

C# Can';t在Xamarin.Forms上使用System.Data.SqlClient,c#,xamarin,xamarin.android,xamarin.forms,C#,Xamarin,Xamarin.android,Xamarin.forms,我需要在我用Xamarin.Forms开发的应用程序上使用System.Data.SqlClient,但我不能使用这个包。我尝试将它添加到“.Droid”项目中(似乎它在PCL上不可用),但在名称空间中找不到它。我通过Visual Studio 2015中的NuGet包管理器添加了它 我需要做一些类似的事情。我知道这是不推荐的。我计划稍后开发一个RESTAPI,但现在我需要这样做,以便构建应用程序的原型/alpha版本 编辑:如果我不能使用SqlClient,我可以在Xamarin中使用什么来打

我需要在我用Xamarin.Forms开发的应用程序上使用
System.Data.SqlClient
,但我不能使用这个包。我尝试将它添加到“.Droid”项目中(似乎它在PCL上不可用),但在名称空间中找不到它。我通过Visual Studio 2015中的NuGet包管理器添加了它

我需要做一些类似的事情。我知道这是不推荐的。我计划稍后开发一个RESTAPI,但现在我需要这样做,以便构建应用程序的原型/alpha版本


编辑:如果我不能使用SqlClient,我可以在Xamarin中使用什么来打开与SQL Server的连接

如果你想使用
System.Data.SqlClient
,你需要使用你链接到自己的帖子中提到的方法。原因很简单,包不是作为PCL构建的


如果不可行,建议使用PCL兼容的。

SQLite将SQL数据库实现到Xamarin.Forms应用程序

下面是将SQLite添加到Xamarin.Forms应用程序的演练

演练 1.添加SQLite NuGet包 将创建人添加到解决方案中的每个项目中;i、 将这个NuGet包添加到你的Xamarin.Forms PCL、Android项目中,等等

2.创建数据库类 将此类添加到Xamarin.Forms PCL中

public class App : Application
{
    static OpportunityModelDatabase _database;

    ...

    public static OpportunityModelDatabase Database =>
        _database ?? (_database = new OpportunityModelDatabase());
}
此数据库类将用于将数据保存到SQLite数据库并从中加载数据

public class Database
{
    #region Constant Fields
    readonly static object _locker = new object();
    readonly SQLiteConnection _database;
    #endregion

    #region Constructors
    public Database()
    {
        _database = DependencyService.Get<ISQLite>().GetConnection();
        _database.CreateTable<DataModel>();
    }
    #endregion

    #region Methods
    public async Task<IList<DataModel>> GetAllDataAsync()
    {
        return await Task.Run(() =>
        {
            lock (_locker)
            {
                return _database.Table<DataModel>().ToList();
            }
        });
    }

    public async Task<int> SaveDataAsync(DataModel dataModel)
    {
        var isDataInDatabase = (await GetAllDataAsync()).FirstOrDefault(x => x.Equals(dataModel)) != null;

        return await Task.Run(() =>
        {
            if (isDataInDatabase)
            {
                lock (_locker)
                {
                    _database.Update(dataModel);
                }
                return dataModel.ID;
            }

            lock (_locker)
            {
                return _database.Insert(dataModel);
            }
        });
    }
    #endregion
4.创建ISQLite的iOS实现 将该类添加到您的Android PCL

ISQLite数据库的这个实现将使用Xamarin.Android文件夹路径检索数据库连接

[assembly: Dependency(typeof(SQLite_Android))]
namespace SampleApp.Droid
{
    public class SQLite_Android : ISQLite
    {
        #region ISQLite implementation
        public SQLiteConnection GetConnection()
        {
            var sqliteFilename = "SQLiteDatabase.db3";
            string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // Documents folder
            var path = Path.Combine(documentsPath, sqliteFilename);

            var conn = new SQLiteConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache);

            // Return the database connection 
            return conn;
        }
        #endregion
    }
}
5.在App.cs中,向数据库添加静态实现 将
Database.cs
的静态实现添加到Xamarin.Forms PCL的
App
类中

public class App : Application
{
    static OpportunityModelDatabase _database;

    ...

    public static OpportunityModelDatabase Database =>
        _database ?? (_database = new OpportunityModelDatabase());
}
6.现在,从应用程序中的任何位置访问数据库数据 下面是一个如何从不同类检索数据的示例

var AllData = await App.Database.GetAllDataAsync();
示例应用程序 下面是我创建的一个示例应用程序,它演示了如何在Xamarin.Forms应用程序中实现SQLite。请随意下载,以更好地了解如何实现SQLite!

从应用程序中的
NuGet
下载
system.data.sqlite
软件包。它将为您提供诸如
system.data
system.data.sqlclient
system.data.sqlLite
等用于数据库连接的程序集。

我以前使用Xamarin a时遇到过同样的问题。据我所知,SQLite是受支持的。然而,我真正开始工作的是AzureSQL和Xamarin,它工作得非常好,我认为您应该能够使用SQLServerManagementStudio。我不认为你的作品中有任何问题,所以我的评论是阅读你的文章时的一种想法。你可以在你的Mono项目(如iOS)中包括对System.Data和Mono.Data.Tds的引用,并直接连接到MSSQL。但是,这样做意味着您必须在MSSQL服务器上启用TCP/IP,以允许iOS或Android设备直接连接到MSSQL,这会带来潜在的安全风险。最好将数据放在经过身份验证的ASP.NET核心JSON API后面,然后通过Xamarin使用。我不想实现本地数据库。我希望我的应用程序连接到存储在SQL Server上的远程数据库。@jorgemoreira是您的数据托管在Azure上的吗?然后您需要编写前端(GUI/手机),完全独立于SQL数据库,并使用Http调用(非SQL连接)连接到为Http请求提供服务的非GUI后端,执行SQL语句并返回数据。这是穿过这片发展“系统”沼泽的唯一途径。。。。