微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我需要通过 ConnectionString 将我的 ASP.net MVC 项目连接到我的 Google Cloud SQL/PgAdmin 4

如何解决我需要通过 ConnectionString 将我的 ASP.net MVC 项目连接到我的 Google Cloud SQL/PgAdmin 4

我是新来的,这是我的第一个问题。我一般在连接数据库时遇到一些问题,我只在 Visual Studio 中使用本地数据库成功过。

背景

本项目使用的软件:

  • Visual Studio Enterprise 2019
  • Postgresql 12(?)
  • PgAdmin4
  • Google Cloud sql (Postgresql 12)。

我正在用 C# 编程。我使用免费试用版在 Google Cloud Platform 中创建了一个数据库我有一个名为“DrinkandDine”en_US.UTF8 UTF8 的数据库正在运行。它所说的实例是“jasc1800”,这就是我给它起的名字。

我通过公共 IP 在 Google Cloud Platform 内部创建了一个新连接:

名称:DrinkAndDine 网络:我的 IPv4 地址

然后我进入 PgAdmin 4 并连接到这个服务器数据库。它工作正常,到目前为止我已经创建了一个名为“users”的表,只有一个 ID 和电子邮件

连接

在 Visual Studio ASP.net MVC 项目中,我将其放入 Web.config 中的 connectionStrings 中:

<add name="DefaultConn" connectionString="Server=35.xx.x.xx; Port=5432; Database=DrinkandDine; User Id=postgres; Password=xx;"/>

我这样做是因为我知道我需要连接到 PgAdmin 4 数据库?还是我理解错了? Visual Studio 项目连接到 PgAdmin 4 连接,然后 PgAdmin 4 连接到 Google Cloud Platform。

然后我想在一个页面显示所有用户

我创建了一个名为 AppDbContext 的类:DbContext(从 DbContext 继承)并在里面放入以下代码

public List<User> GetAllUsers()
        {
            User user;
            List<User> userList = new List<User>();
    
            string stmt = "SELECT * FROM User";
    
            var conn = new 
            NpgsqlConnection(ConfigurationManager.ConnectionStrings["DefaultConn"].ConnectionString);
            conn.open();
    
            var cmd = new NpgsqlCommand(stmt,conn);
            var reader = cmd.ExecuteReader();
    
            while (reader.Read())
            {
                user = new User()
            {
                Id = reader.GetInt32(0),Email = reader.GetString(1),};
            }
    return userList;
    }

然后我在 HomeController 中创建了以下内容

public ActionResult GetAllUsers()
    {
        AppDbContext db = new AppDbContext();
        return View(db.GetAllUsers());
    }

之后,我将其放入一个名为 GetAllUsers 的视图中:

@model List<DrinkAndDine.Models.User>
        @{
        ViewBag.Title = "GetAllUsers";
        }
    
        <div>
        <h2>These are the users on the website</h2>
        <p>
            @foreach (var item in Model)
            {
                <p>
                    ID: @item.Id Email: @item.Email
                </p>
            }
        </p>
        </div>

当我启动页面查看用户时,我得到了这个:

system.invalidCastException
  HResult=0x80004002
  Message=Can't cast database type name to Int32
  Source=Npgsql
  StackTrace:
   at Npgsql.TypeHandling.NpgsqlTypeHandler`1.Read[TAny](NpgsqlReadBuffer buf,Int32 len,Boolean async,FieldDescription fieldDescription)
   at Npgsql.TypeHandling.NpgsqlTypeHandler`1.Read[TAny](NpgsqlReadBuffer buf,FieldDescription fieldDescription)
   at Npgsql.NpgsqlDataReader.GetFieldValue[T](Int32 ordinal)
   at Npgsql.NpgsqlDataReader.GetInt32(Int32 ordinal)
   at DrinkAndDine.Models.AppDbContext.GetAllUsers() in C:\Users\jakob\OneDrive\Desktop\Programming\Visual Studio Projects\DrinkAndDine\Models\AppDbContext.cs:line 34
   at DrinkAndDine.Controllers.HomeController.GetAllUsers() in C:\Users\jakob\OneDrive\Desktop\Programming\Visual Studio Projects\DrinkAndDine\Controllers\HomeController.cs:line 34
   at System.Web.Mvc.ActionMethoddispatcher.Execute(ControllerBase controller,Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c.<BeginInvokeSynchronousActionMethod>b__9_0(IAsyncResult asyncResult,ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__displayClass11_0.<InvokeActionMethodFilterasynchronouslyRecursive>b__0()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__displayClass11_2.<InvokeActionMethodFilterasynchronouslyRecursive>b__2()

这是很多信息,我不知道我需要做什么或做错了什么。一开始我尝试了一种不同的方法,但也不起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。